我有生命周期感知的协程
abstract class AppViewModel : ViewModel(), CoroutineScope {
private val job = Job()
override val coroutineContext: CoroutineContext
get() = Dispatchers.Main + job
override fun onCleared() {
super.onCleared()
job.cancel()
}
}
如果我在视图模型中使用
launch {
}
它会导致磁盘冲突
D / StrictMode:违反StrictMode策略; 〜duration = 200毫秒:android.os.strictmode.DiskReadViolation
在此行
get() = Dispatchers.Main + job
我做错了什么?
编辑
我创建了另一个示例,并且此错误仍然存在
class MainActivity : AppCompatActivity(), CoroutineScope {
protected val job = SupervisorJob()
override val coroutineContext = Dispatchers.Main + job
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
launch {
val e = withContext(Dispatchers.Default) {
4
}
text.text = e.toString()
}
}
override fun onDestroy() {
super.onDestroy()
job.cancel()
}
}
答案 0 :(得分:0)
当您尝试在UI线程中执行查询时,会发生此错误。根据您的代码,尝试以这种方式更改协程上下文:
//Code here stays same
override val coroutineContext: CoroutineContext
get() = Dispatchers.IO + job
//Code here stays same
所以在这里,您将在IO线程和UI线程之外启动协程。
希望对您有所帮助!