Kotlin协程磁盘违规严格模式

时间:2019-01-12 08:54:24

标签: android kotlin kotlinx.coroutines android-strictmode

我有生命周期感知的协程

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()
    }
}

1 个答案:

答案 0 :(得分:0)

当您尝试在UI线程中执行查询时,会发生此错误。根据您的代码,尝试以这种方式更改协程上下文:

//Code here stays same
override val coroutineContext: CoroutineContext
  get() = Dispatchers.IO + job
//Code here stays same

所以在这里,您将在IO线程和UI线程之外启动协程。

希望对您有所帮助!