Android Kotlin协同例程异常

时间:2020-04-20 15:45:18

标签: android kotlin exception kotlin-coroutines

我正在尝试使用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,但是如果没有这些工作原理的基本知识,我就没有真正的进步。

谢谢您的任何帮助。

2 个答案:

答案 0 :(得分:1)

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

这不是可挂起的函数。它启动并发协程并立即返回。显然,调用requestFileId()绝不会引发异常。

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

答案 1 :(得分:0)

在模型中,将其更改为以下内容:

fun requestFileId() {
  viewModelScope.launch {
    try {
      ApiService.requestFileId()
    } catch (e: Exception) {
      // inform your view
    }
  }
}