【发布时间】: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