2
votes

When I try to do a POST request using khttp, I get this error:

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.emir.getirme, PID: 9379
    android.os.NetworkOnMainThreadException
        at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1448)
        at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:355)
        at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:200)
        at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:182)
        at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:356)
        at java.net.Socket.connect(Socket.java:616)
        at com.android.okhttp.internal.Platform.connectSocket(Platform.java:145)
        at com.android.okhttp.internal.io.RealConnection.connectSocket(RealConnection.java:141)
        at com.android.okhttp.internal.io.RealConnection.connect(RealConnection.java:112)
        at com.android.okhttp.internal.http.StreamAllocation.findConnection(StreamAllocation.java:184)
        at com.android.okhttp.internal.http.StreamAllocation.findHealthyConnection(StreamAllocation.java:126)
        at com.android.okhttp.internal.http.StreamAllocation.newStream(StreamAllocation.java:95)
        at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:281)
        at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:224)
        at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:461)
        at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:407)
        at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getHeaders(HttpURLConnectionImpl.java:163)
        at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getHeaderFields(HttpURLConnectionImpl.java:223)
        at khttp.responses.GenericResponse$Companion.getCookieJar$khttp(GenericResponse.kt:35)
        at khttp.responses.GenericResponse$Companion$defaultEndInitializers$3.invoke(GenericResponse.kt:116)
        at khttp.responses.GenericResponse$Companion$defaultEndInitializers$3.invoke(GenericResponse.kt:32)
        at khttp.responses.GenericResponse$connection$2.invoke(GenericResponse.kt:164)
        at khttp.responses.GenericResponse$connection$2.invoke(GenericResponse.kt:30)
        at khttp.responses.GenericResponse.openRedirectingConnection$khttp(GenericResponse.kt:124)
        at khttp.responses.GenericResponse.getConnection(GenericResponse.kt:163)
        at khttp.responses.GenericResponse.getRaw(GenericResponse.kt:207)
        at khttp.responses.GenericResponse.getContent(GenericResponse.kt:216)
        at khttp.responses.GenericResponse.init$khttp(GenericResponse.kt:350)
        at khttp.KHttp.request(KHttp.kt:59)
        at khttp.KHttp.post(KHttp.kt:48)
        at khttp.KHttp.post$default(KHttp.kt:47)
        at com.emir.getirme.MainActivity.onCreate$lambda-1(MainActivity.kt:51)
        at com.emir.getirme.MainActivity.lambda$3IBZyc9kPzUSvfk0gsgNPVZ2ETU(Unknown Source:0)
        at com.emir.getirme.-$$Lambda$MainActivity$3IBZyc9kPzUSvfk0gsgNPVZ2ETU.onClick(Unknown Source:2)
        at android.view.View.performClick(View.java:6256)
        at com.google.android.material.button.MaterialButton.performClick(MaterialButton.java:1119)
        at android.view.View$PerformClick.run(View.java:24701)
        at android.os.Handler.handleCallback(Handler.java:789)
        at android.os.Handler.dispatchMessage(Handler.java:98)
        at android.os.Looper.loop(Looper.java:164)
        at android.app.ActivityThread.main(ActivityThread.java:6541)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)

This is my code:

khttp.post(
    "http://127.0.0.1:5000/order",
    headers = mapOf(
        "address" to address.toString(),
        "items" to Json.encodeToString(listOf("Su x1", "Gofret x5", "Dondurma x1")),
        "price" to "100",
        "orderer" to name.toString(),
        "phone" to phone.toString()
    ),
)

I'm trying to send a request to a Flask server running in my local PC. The server is not the problem as I tested it with Python.

The code is not inside an async task or any type of async function. I tried to use khttp.async but I didn't have khttp.async for some reason.

1
how do you call khttp.post, from Activity, viewModel? - mightyWOZ
@mightyWOZ It's inside a setOnClickListener{} which is inside my AppCompatActivity imgur.com/QGOq28V - Emir Sürmen

1 Answers

1
votes

Even though the exception message is very clear, If you want to understand in detail why this happens, please read

As to how you can fix this, you can use kotln coroutines for this, once you have included the given dependencies in your build, you can do the following

// Start network request on a background thread using coroutine
lifecycleScope.launch(Dispatchers.IO) { 
    khttp.post(
        "http://127.0.0.1:5000/order",
         headers = mapOf(
            "address" to address.toString(),
            "items" to Json.encodeToString(listOf("Su x1", "Gofret x5", "Dondurma x1")),
            "price" to "100",
            "orderer" to name.toString(),
            "phone" to phone.toString()
        ),
    )
}