【问题标题】:kotlin coroutines disk violation strict modekotlin协程磁盘违规严格模式
【发布时间】:2019-01-12 08:54:23
【问题描述】:

我有生命周期感知协程

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

【问题讨论】:

  • launch 块中的代码是什么?
  • 它是空块,只是为了表明内部代码对这个错误没有影响
  • 假设它在某种程度上取决于这个问题:github.com/Kotlin/kotlinx.coroutines/issues/878
  • 我也遇到了同样的问题。即使我正在使用调度程序 IO。如果您解决问题,请发布解决方案。 fun specialWork() = liveData(viewModelScope.coroutineContext + Dispatchers.IO + handler) { }

标签: android kotlin kotlinx.coroutines android-strictmode


【解决方案1】:

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

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

因此,您将在 IO 线程和 UI 线程之外启动协程。

希望对您有所帮助!

【讨论】:

  • viewModelScope 最好与 Dispatcher 一起使用
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-22
  • 2013-08-10
  • 2017-02-25
  • 2011-09-12
  • 1970-01-01
相关资源
最近更新 更多