这是我正在使用的代码:
(application as TestApp).applicationScope.launch(Dispatchers.IO) {
println("Thread 2 "+Thread.currentThread().name)
binding.username.setText("text2")
}
(application as TestApp).applicationScope.launch(Dispatchers.Default) {
println("Thread 3 "+Thread.currentThread().name)
binding.username.setText("text3")
}
在这里,我正在访问Dispatchers上的TextView。IO和调度员。"活动"中的默认线程,该线程不是主线程。尽管如此,该应用程序运行正常,不会引发任何异常。
打印的线程名称为:
Thread 3 DefaultDispatcher-worker-4
Thread 2 DefaultDispatcher-worker-2
为什么?
它为我抛出(在Fragment
中使用lifecycleScope
(:
CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
你对那些println
语句的输出是什么,线程名称不同吗?你用什么线给binding
充气?
在您的特定环境中,这些协同程序可能不会在不同的线程上执行。就像我运行它时一样,IO
和Default
调度器最终都会打印一个以Defaultdispatcher-worker-
开头的线程名称,这意味着它们是从Default
调度器的线程池开始的。还有一个无限制的调度器:
调度程序。未定义的协程调度器在调用线程中启动一个协程,但只启动到第一个挂起点。挂起后,它将恢复线程中的协同程序,该协同程序完全由调用的挂起函数决定。
由于协同程序不会挂起(例如使用delay
(,因此它们可能会在执行转移到另一个线程之前命中UI更新。正如上面所说,Dispatchers.Unconfined
是一个边缘案例调度器,一般不建议使用,但类似的事情可能会在幕后发生,从而更有效地处理调度。(但对我来说不是!(你可以尝试在触摸UI之前给每个添加一个delay
,看看它是否会改变
(我对郊游的基本管理不太了解,我可能完全不了解。我只是指出这是一条可能的调查路线,因为你看到了奇怪的行为!(