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

标签 android kotlin coroutine

我关注 this official guide on coroutine ,并且 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) }
    }
}
  • 我是不是做错了什么导致了viewModel.isSignedIn()不在后台线程上运行?
  • 如果代码没有错,这是否意味着“由于协程实际上并没有阻塞线程,所以 StrictMode.detectNetwork 和 Disk 是无关紧要的”?

  • 更新:添加 StrictMode 配置和日志

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

    日志:
    2018-10-14 13:11:36.411 13542-13542/io.github.louistsaitszho.loft E/AndroidRuntime: FATAL EXCEPTION: main
        Process: io.github.louistsaitszho.loft, PID: 13542
        java.lang.RuntimeException: StrictMode ThreadPolicy violation
            at android.os.StrictMode$AndroidBlockGuardPolicy.onThreadPolicyViolation(StrictMode.java:1705)
            at android.os.StrictMode$AndroidBlockGuardPolicy.lambda$handleViolationWithTimingAttempt$0(StrictMode.java:1619)
            at android.os.-$$Lambda$StrictMode$AndroidBlockGuardPolicy$9nBulCQKaMajrWr41SB7f7YRT1I.run(Unknown Source:6)
            at android.os.Handler.handleCallback(Handler.java:873)
            at android.os.Handler.dispatchMessage(Handler.java:99)
            at android.os.Looper.loop(Looper.java:193)
            at android.app.ActivityThread.main(ActivityThread.java:6669)
            at java.lang.reflect.Method.invoke(Native Method)
            at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
         Caused by: android.os.strictmode.DiskReadViolation
            at android.os.StrictMode$AndroidBlockGuardPolicy.onReadFromDisk(StrictMode.java:1504)
            at java.io.UnixFileSystem.getBooleanAttributes(UnixFileSystem.java:241)
            at java.io.File.isDirectory(File.java:845)
            at dalvik.system.DexPathList$Element.maybeInit(DexPathList.java:696)
            at dalvik.system.DexPathList$Element.findResource(DexPathList.java:729)
            at dalvik.system.DexPathList.findResources(DexPathList.java:526)
            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)
            at kotlin.collections.CollectionsKt___CollectionsKt.toCollection(_Collections.kt:1062)
            at kotlin.collections.CollectionsKt___CollectionsKt.toMutableList(_Collections.kt:1095)
            at kotlin.collections.CollectionsKt___CollectionsKt.toList(_Collections.kt:1086)
            at kotlinx.coroutines.experimental.MainDispatcherLoader.<clinit>(Dispatchers.kt:97)
            at kotlinx.coroutines.experimental.Dispatchers.getMain(Dispatchers.kt:54)
            at io.github.louistsaitszho.loft.ScopedFragment.getCoroutineContext(ScopedFragment.kt:20)
            at kotlinx.coroutines.experimental.CoroutineContextKt.newCoroutineContext(CoroutineContext.kt:81)
            at kotlinx.coroutines.experimental.BuildersKt__Builders_commonKt.launch(Builders.common.kt:49)
            at kotlinx.coroutines.experimental.BuildersKt.launch(Unknown Source:1)
            at kotlinx.coroutines.experimental.BuildersKt__Builders_commonKt.launch$default(Builders.common.kt:46)
            at kotlinx.coroutines.experimental.BuildersKt.launch$default(Unknown Source:1)
            at io.github.louistsaitszho.loft.splash.SplashFragment.onStart(SplashFragment.kt:28)
            at android.support.v4.app.Fragment.performStart(Fragment.java:2372)
            at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1467)
            at android.support.v4.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1759)
            at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1827)
            at android.support.v4.app.FragmentManagerImpl.dispatchStateChange(FragmentManager.java:3244)
            at android.support.v4.app.FragmentManagerImpl.dispatchStart(FragmentManager.java:3206)
            at android.support.v4.app.Fragment.performStart(Fragment.java:2378)
            at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1467)
            at android.support.v4.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1759)
            at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1827)
            at android.support.v4.app.FragmentManagerImpl.dispatchStateChange(FragmentManager.java:3244)
            at android.support.v4.app.FragmentManagerImpl.dispatchStart(FragmentManager.java:3206)
            at android.support.v4.app.FragmentController.dispatchStart(FragmentController.java:206)
            at android.support.v4.app.FragmentActivity.onStart(FragmentActivity.java:605)
    2018-10-14 13:11:36.412 13542-13542/io.github.louistsaitszho.loft E/AndroidRuntime:     at android.support.v7.app.AppCompatActivity.onStart(AppCompatActivity.java:177)
            at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1391)
            at android.app.Activity.performStart(Activity.java:7157)
            at android.app.ActivityThread.handleStartActivity(ActivityThread.java:2937)
            at android.app.servertransaction.TransactionExecutor.performLifecycleSequence(TransactionExecutor.java:180)
            at android.app.servertransaction.TransactionExecutor.cycleToPath(TransactionExecutor.java:165)
            at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:142)
            at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:70)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1808)
            at android.os.Handler.dispatchMessage(Handler.java:106)
    

    最佳答案

    我认为您遇到了 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 中修复:

    Avoid ServiceLoader for loading Dispatchers.Main (#1572, #1557, #878, #1606).

    关于android - StrictMode.detectNetwork/Disk 是否仍然适用于协程世界?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52801890/

    相关文章:

    kotlin - kotlin中Nothing类型的推理

    python - 在 Tornado 中,如何将 'decorate' 协程 GET 函数

    java - 在 Android 上使用 GSON 将 JSON 日期格式解析为字符串

    android - 将设备插件(和其他)手动安装到 cordova 3.0

    android - 我如何将此代码写入线程或 AsyncTask?

    kotlin - 如何使用Kotlin协同程序正确进行阻止服务调用?

    python - 让 Django 变绿

    android - Activity 和服务之间的偏好

    android - 使用 Kotlin Android Extensions 以编程方式扩展布局

    android - Kotlin 中的字符串到位图