1

我正在使用带有协程的改造(内置支持)。我有一个 Retrofit 接口、改造实现和由 Retrofit 创建的 API 实现,但这并不重要,因为它不会被调用。在此之前它崩溃了,这里:在XService.kt

suspend fun test() {
    val mediaType = MediaType.parse("text/plain")
    val requestBody = RequestBody.create(mediaType, "TEST STRING")  // Crashes here
    // Now make some network requests
}

由 viewModel 调用:

    suspend fun test() {
        return withContext(viewModelScope.coroutineContext) {
            service.test()
        }
    }

由片段调用:

lifecycleScope.launch() { model.test() }

无用的错误:

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: package_name, PID: 9729
I/Process: Sending signal. PID: 9729 SIG: 9

我只是不确定为什么创建一个RequestBody会导致崩溃。奇怪的是,当调试并慢慢通过代码时,它不会崩溃......我已经简化了代码,所以它更容易阅读,但它的范围为片段而不是 VM 的原因是因为我想要根据响应更改 UI 的 Fragment。

编辑:事实证明,如果我将它包装在 try/catch 块中,崩溃的行通常不会崩溃。相反,之后的网络调用会打印出来:

I/System.out: java.net.UnknownHostException: Unable to resolve host "qats.orth.uk": No address associated with hostname
        try {
        val requestBody = RequestBody.create(mediaType, mode.toString())
        return api.createQuiz(requestBody).createResult()
        } catch (e: Exception) {
            println(e)
        }

所以我很困惑。为什么将它放在 try/catch 块中会改变我收到的错误消息。如果没有 try/catch,我会遇到没有堆栈跟踪的无用崩溃。我想这可能是协程的挑战。

4

0 回答 0