android Dispatchers.IO是否在主线程上运行?

new9mtju  于 2023-01-19  发布在  Android
关注(0)|答案(1)|浏览(188)

请看下面的代码:

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作用域作为协程,但这不是这里的问题--我想了解当前代码抛出异常的原因)

aiqt4smr

aiqt4smr1#

你把scope函数和协程函数搞错了:
with(Dispatchers.IO){ }-一个阻塞调用,其中lambdas主体是作用域(this === Dispatchers.IO
withContext(Dispatchers.IO){ }-挂起在提供的上下文(在本例中,它切换调度程序)中执行的将结果返回到原始上下文的调用

相关问题