访问Dispatchers上的视图.协同程序上的IO不会使应用程序崩溃,为什么?但UI只能通过Android中的MAIN



这是我正在使用的代码:

(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充气?

在您的特定环境中,这些协同程序可能不会在不同的线程上执行。就像我运行它时一样,IODefault调度器最终都会打印一个以Defaultdispatcher-worker-开头的线程名称,这意味着它们是从Default调度器的线程池开始的。还有一个无限制的调度器

调度程序。未定义的协程调度器在调用线程中启动一个协程,但只启动到第一个挂起点。挂起后,它将恢复线程中的协同程序,该协同程序完全由调用的挂起函数决定。

由于协同程序不会挂起(例如使用delay(,因此它们可能会在执行转移到另一个线程之前命中UI更新。正如上面所说,Dispatchers.Unconfined是一个边缘案例调度器,一般不建议使用,但类似的事情可能会在幕后发生,从而更有效地处理调度。(但对我来说不是!(你可以尝试在触摸UI之前给每个添加一个delay,看看它是否会改变

(我对郊游的基本管理不太了解,我可能完全不了解。我只是指出这是一条可能的调查路线,因为你看到了奇怪的行为!(

最新更新