请看下面的代码:
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
lifecycleScope.launchWhenCreated {
with(Dispatchers.IO) {
if (Looper.myLooper() == Looper.getMainLooper()) {
throw Exception("we are on the main thread, though Dispatchers.IO is used")
}
}
}
}
}
实际上这会抛出异常
java.lang.Exception:虽然使用了Dispatchers.IO,但我们仍在主线程上
为什么Dispatchers.IO
不应该使用后台线程吗
(Hint:我知道在大多数情况下,我最好使用ViewModel作用域作为协程,但这不是这里的问题--我想了解当前代码抛出异常的原因)
1条答案
按热度按时间aiqt4smr1#
你把scope函数和协程函数搞错了:
with(Dispatchers.IO){ }
-一个阻塞调用,其中lambdas主体是作用域(this === Dispatchers.IO
)withContext(Dispatchers.IO){ }
-挂起在提供的上下文(在本例中,它切换调度程序)中执行的将结果返回到原始上下文的调用