【发布时间】:2019-09-14 21:37:42
【问题描述】:
我正在尝试 kotlinx.coroutines(版本:1.2.0)。下面是一个简单的测试代码块:
GlobalScope.launch {
Logger.i("${Thread.currentThread()}, ${Looper.myLooper() == Looper.getMainLooper()}")
text_view.text = "test"
}
打印出来的日志是:
Thread[DefaultDispatcher-worker-2,5,main], false
如日志所示,我们不在 Android 主线程,即 UI 线程。但是,当我们在这个工作线程上将 text 设置为 text_view 并且“test”正确设置为 text_view 后,上面的代码不会抛出异常。是什么原因?
更新 1:
在setText() 之前添加delay(10000L) 会导致异常,而较短的时间(例如在我的冷启动调试运行测试中的1000L)不会。所以这似乎是一个Android问题。但是还是那个问题,是什么原因呢?
更新 2:
现在我意识到这种行为与 Android 而不是 kotlinx.coroutines 有关。当ViewRootImpl 可能没有调用performTraversals() 或初始化所有Views 时,上面的代码在onCreate() 中执行。在这种情况下,也不会调用 UI 操作之前的 checkThread()。
【问题讨论】:
-
您需要从
Dispatcher提供主线程,这将使其在主线程上运行。 -
这不是问题,对吧?他在问为什么这种行为是可能的。
-
@ywwynm 你在用
CorountineScope吗? -
@BramSinke 不。我只使用上面显示的代码。
-
那么,在 Update 2: 之后,您似乎找到了答案,对吧?
标签: android multithreading kotlin coroutine kotlin-coroutines