我正在尝试使用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()
将永远不会引发异常。启动协程就像启动另一个线程一样,它会在您的代码中引入并发性。如果您当前的代码希望在观察可挂起函数的结果时保持非并发状态,则您可能正在考虑对应用程序进行重大架构更改,以使其在并发下正确运行。