Kotlin 协程 - 调度程序开关不起作用

问题描述 投票:0回答:1

我有这个代码:

coroutineScope.launch(Dispatchers.IO) {
        if (openGraphParser != null && isActive) {
            Logger.info("Loading OpenGraph data for $link")
            val content = openGraphParser.getContents(link, messageText)
            Logger.info("OpenGraph data for $link received")

            withContext(Dispatchers.Main) {
                Logger.info("Showing OpenGraph data for $link")
                onOgDataReceived(content)
            }
        }

我没有看到日志:“显示 $link 的 OpenGraph 数据”。 “withContext(...)”内部的代码根本没有被调用。为什么?有人可以向我解释一下吗?最后一条日志是“收到 $link 的 OpenGraph 数据”。如果我把它改成

coroutineScope.launch(Dispatchers.IO) {
        if (openGraphParser != null && isActive) {
            Logger.info("Loading OpenGraph data for $link")
            val content = openGraphParser.getContents(link, messageText)
            Logger.info("OpenGraph data for $link received")

            ogDataContent?.ogDataLayout?.get()?.post {
                Logger.info("Showing OpenGraph data for $link")
                onOgDataReceived(content)
            }
        }
    }

比视图中的帖子一切正常。

android kotlin kotlin-coroutines
1个回答
0
投票

你的

coroutine scope
好像发生了异常。你看不到它,因为你没有使用
CoroutineExceptionHandler
,并且作用域吞噬了异常。解决方案是向您的范围提供
CoroutineExceptionHandler
,如下所示:

val exceptionHandler = CoroutineExceptionHandler { _: CoroutineContext, throwable: Throwable ->
    throwable.printStackTrace()
}
coroutineScope.launch(Dispatchers.IO + exceptionHandler) {
    if (openGraphParser != null && isActive) {
        Logger.info("Loading OpenGraph data for $link")
        val content = openGraphParser.getContents(link, messageText)
        Logger.info("OpenGraph data for $link received")
        
        withContext(Dispatchers.Main) {
            Logger.info("Showing OpenGraph data for $link")
            onOgDataReceived(content)
        }
    }
}

然后检查您的

logcat
以查看异常日志。

© www.soinside.com 2019 - 2024. All rights reserved.