StrictMode.detectNetwork / Disk是否仍适用于协程世界?

时间:2018-10-14 10:51:34

标签: android kotlin coroutine

我正在关注this official guide on coroutine,尽管我已指定它在{{1}上运行,但StrickMode一直抱怨磁盘正在MainThread上进行读/写操作(isSignedIn使用SharedPreference)。 }。

Dispatchers.IO
  1. 我做错了什么并且导致override fun onStart() { super.onStart() launch { val isSignedIn = async(Dispatchers.IO) { viewModel.isSignedIn() } val navigationAction = if (isSignedIn.await()) R.id.action_splashFragment_to_mainFragment else R.id.action_splashFragment_to_whatIsLoftFragment withContext(Dispatchers.Main) { navigateToNextWithDelay(action = navigationAction) } } } 不在后台线程上运行吗?

  2. 如果代码没有错,是否表示“由于协程实际上并未阻塞线程,因此StrictMode.detectNetwork和Disk无关”?

更新:添加StrictMode配置并记录

viewModel.isSignedIn()

日志:

private fun setupStrictMode() {
    if (BuildConfig.DEBUG) {
        StrictMode.setThreadPolicy(StrictMode.ThreadPolicy.Builder()
                .detectAll()
                .penaltyLog()
                .penaltyDeath()
                .build()
        )
        StrictMode.setVmPolicy(StrictMode.VmPolicy.Builder()
                .detectAll()
                .penaltyLog()
                .penaltyDeath()
                .build()
        )
    }
}

1 个答案:

答案 0 :(得分:1)

我认为您遇到了Slow android Dispatchers.Main init中报告的问题。

这在堆栈跟踪的以下部分中可见:

    at dalvik.system.BaseDexClassLoader.findResources(BaseDexClassLoader.java:174)
    at java.lang.ClassLoader.getResources(ClassLoader.java:839)
    at java.util.ServiceLoader$LazyIterator.hasNextService(ServiceLoader.java:349)
    at java.util.ServiceLoader$LazyIterator.hasNext(ServiceLoader.java:402)
    at java.util.ServiceLoader$1.hasNext(ServiceLoader.java:488)

它已在版本1.3.3 which landed in December中修复:

避免使用ServiceLoader加载Dispatchers.Main(#1572#1557#878#1606)。