POST 请求上的 KHTTP android.os.NetworkOnMainThreadException

时间:2021-07-26 06:47:33

标签: http kotlin

当我尝试使用 khttp 执行 POST 请求时,出现此错误:

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)

这是我的代码:

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()
    ),
)

我正在尝试向在本地 PC 中运行的 Flask 服务器发送请求。服务器不是问题,因为我用 Python 测试过。

代码不在异步任务或任何类型的异步函数中。我尝试使用 khttp.async,但由于某种原因我没有 khttp.async

1 个答案:

答案 0 :(得分:1)

即使异常消息非常清楚,如果您想详细了解发生这种情况的原因,请read

至于如何解决这个问题,您可以使用 kotln coroutines 来解决这个问题,一旦您在构建中包含了给定的依赖项,您就可以执行以下操作

// 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()
        ),
    )
}
相关问题