【发布时间】:2021-01-29 13:16:31
【问题描述】:
我的 Android 应用需要在后台(在服务内)进行一些文件读/写,首先我使用:
CoroutineScope(Dispatchers.IO).launch {
val fos = openFileOutput(fileName, MODE_PRIVATE)
val oos = ObjectOutputStream(fos)
oos.writeObject(myObj)
oos.close()
}
块内的每一行都有一个警告:“不适当的阻塞方法调用”
搜索问题后,我想我理解了 80%。所以基本上大多数协程只有 1 个线程,如果它被阻塞,那个协程将没有线程来做其他工作。为了解决这个问题,我们应该像这样将它包裹在 withContext 中:
CoroutineScope(Dispatchers.IO).launch {
withContext(Dispatchers.IO) {
val fos = openFileOutput(fileName, MODE_PRIVATE)
val oos = ObjectOutputStream(fos)
oos.writeObject(myObj)
oos.close()
}
}
Android Studio 仍然显示警告。 The post说这只是Android Studio的一个bug,这个解决方案很好。
我不明白的是,withContext 仍在Dispatchers.IO 上运行。从launch 块来看,它可能看起来像是非阻塞的,但如果Dispatchers.IO 只有1 个线程并且withContext 块在该线程上运行,那么该线程仍然被阻塞不是吗?
我还了解到Dispatchers.IO 实际上有几乎无限的线程,它只是在需要时创建一个新线程。所以withContext 实际上并没有阻塞,但如果这是真的,为什么我们需要withContext 块?如果Dispatchers.IO可以在需要的时候创建线程,那么第一个代码不会有任何问题,因此永远不会被阻塞,对吧?
【问题讨论】:
标签: android multithreading kotlin kotlin-coroutines