android - 使用 withContext 方法在 kotlin 协程中进行 try-catch

标签 android kotlin kotlin-coroutines

我发现一些文档争论 Kotlin 协程中使用 launchasync 进行异常处理的问题。但我找不到处理 withContext 的解决方案。

假设我有一个像这样的协程:

fun bar(path: String) {
    viewModelScope.launch {
        val foo = withContext(Dispatchers.IO) {
             foo(path)
        }
    }
}

fun foo(path: String) {
    // do something...
    val media = MediaMetadataRetriever()
    media.setDataSource(path)  // may throw IllegalArgumentException according to API's doc
    return media.frameAtTime
}

viewModelScope 是使用 SupervisorJoblifecycle-viewmodel-ktx 的实现导入的。

我应该在哪里放置一个 try-catch block 来处理这里的 IOException?

最佳答案

Kotlin 协程中的

try-catch 感觉有点笨拙,但我认为部分原因是 Kotlin 的设计者认为你不应该首先使用它。当某些事情是受检查的异常(由程序员控制之外的事情引起)时,他们的建议是包装它或返回 null。例如:

fun foo(path: String): Bitmap? {
    // do something...
    val media = MediaMetadataRetriever()
    try {
        media.setDataSource(path)
    catch (e: IOException) {
        Log.e(TAG, "Failed to set media data source", e)
        return null
    }
    return media.frameAtTime
}

fun bar(path: String) {
    viewModelScope.launch {
        val foo = withContext(Dispatchers.IO) {
             foo(path)
        }
        if (foo == null) {
            // show error to user or something
        } else {
           // do something with smart-cast non-null foo Bitmap
        }
    }
}

顺便说一句,对于像 foo 这样永远不会从主线程调用的阻塞函数,我建议将其设为 suspend 函数并移动 withContext(Dispatchers.IO) 到函数中,因此它是独立的,您可以从任何协程中自由调用它。

关于android - 使用 withContext 方法在 kotlin 协程中进行 try-catch,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63615738/

相关文章:

android - 如何获取最新的 Room 版本?

android - 测试 Android Kotlin 应用程序 - 使用 Dagger 的 Mockito 注入(inject) null

android - Kotlin 协程等待 2 个或更多不同的并发请求

Android 菜单 View 、gridview 或其他?

java - PageFragment和TextView : Why i get an error?

java - Android Studio ListView 不会显示适配器中的项目

android - 如何使用 Kotlin 延迟加载协程刷新 ViewModel 数据?

android - 如何阻止 AOSP 从供应商图像加载 .so

java - 将activity_main.xml转换为数据绑定(bind)布局时出现 "androidx.*...*.ConstraintLayout"is not allowed怎么解决?

android - viewModelScope 默认为 MainThread 的原因是什么?