我正在尝试使用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,但是如果没有这些工作原理的基本知识,我就没有真正的进步。
谢谢您的任何帮助。
答案 0 :(得分:1)
fun requestFileId() {
viewModelScope.launch {
ApiService.requestFileId()
}
}
这不是可挂起的函数。它启动并发协程并立即返回。显然,调用requestFileId()
绝不会引发异常。
启动协程就像启动另一个线程一样,它将并发引入代码中。如果您当前的代码希望在观察可挂起功能的结果时保持非并发状态,那么您可能正在考虑对应用程序进行重大的体系结构更改,以使其在并发下正常运行。
答案 1 :(得分:0)
在模型中,将其更改为以下内容:
fun requestFileId() {
viewModelScope.launch {
try {
ApiService.requestFileId()
} catch (e: Exception) {
// inform your view
}
}
}