我正在尝试使用Kotlin协同例程来触发网络请求并处理异常。我看过很多有关协例程的教程,但我真的很难将我所知道的问题与我遇到的问题联系起来。

问题

试图获取要在View中捕获的异常,但是ViewModel不会引发任何异常,因此应用程序崩溃。

编码

我的Android应用具有与该问题有关的三层。我有View,ViewModel和Service层。
在服务层中,request.execute()可以引发UserAuthException。

MyView(查看)

private val mViewModel: MyViewModel by viewModels()

private fun getFileId() {
    try {
        mViewModel.requestFileId()
    } catch (e: UserAuthException) {
        Timber.i(e)
    }
}

MyViewModel(ViewModel)
private val apiService = MyApiService()

fun requestFileId() {
    viewModelScope.launch {
        ApiService.requestFileId()
    }
}

MyApiService(服务层)
suspend fun requestFileId(): FileId = withContext(Dispatchers.IO) {
    request.execute()
}

我看过的东西

我没有和运气一起玩过CoroutineExceptionHandlers,supervisorJobs,但是如果没有这些工作原理的基本知识,我就没有真正的进步。

任何帮助,将不胜感激,谢谢。

最佳答案

fun requestFileId() {
    viewModelScope.launch {
        ApiService.requestFileId()
    }
}

这不是可暂停的功能。它启动并发协程并立即返回。显然,调用requestFileId()将永远不会引发异常。

启动协程就像启动另一个线程一样,它会在您的代码中引入并发性。如果您当前的代码希望在观察可挂起函数的结果时保持非并发状态,则您可能正在考虑对应用程序进行重大架构更改,以使其在并发下正确运行。

09-11 19:33
查看更多