我正在关注this official guide on coroutine,尽管我已指定它在{{1}上运行,但StrickMode一直抱怨磁盘正在MainThread上进行读/写操作(isSignedIn
使用SharedPreference)。 }。
Dispatchers.IO
我做错了什么并且导致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) }
}
}
不在后台线程上运行吗?
如果代码没有错,是否表示“由于协程实际上并未阻塞线程,因此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()
)
}
}
答案 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)。