gpt4 book ai didi

android - 当启动严格模式并将 `android:persistent`设置为 `true`时会出错。我该如何解决这个错误?

转载 作者:行者123 更新时间:2023-11-29 02:29:02 39 4
gpt4 key购买 nike

当启动严格模式并将android:persistent设置为true时会报错。我该如何解决这个错误?谢谢。

申请

override fun onCreate() {
if (BuildConfig.DEBUG) {
setStrictMode()
}
super.onCreate()
}

private fun setStrictMode() {
StrictMode.setThreadPolicy(StrictMode.ThreadPolicy.Builder()
.detectDiskReads()
.detectDiskWrites()
.detectNetwork() // or .detectAll() for all detectable problems
.penaltyLog()
.build())
StrictMode.setVmPolicy(StrictMode.VmPolicy.Builder()
.detectLeakedSqlLiteObjects()
.detectLeakedClosableObjects()
.penaltyLog()
.penaltyDeath()
.build())
}

preference_example.xml

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">

<SwitchPreference
android:key="switch_preference_night_mode"
android:persistent="true"
android:title="@string/theme_settings_night_mode" />

</PreferenceScreen>

PreferenceFragment:

public class ThemeSettingsFragment extends PreferenceFragmentCompat {

@Override
public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
setPreferencesFromResource(R.xml.preference_example, rootKey);
}
}

错误日志:

StrictMode: StrictMode policy violation; ~duration=30 ms: android.os.strictmode.DiskReadViolation
at android.os.StrictMode$AndroidBlockGuardPolicy.onReadFromDisk(StrictMode.java:1500)
at java.io.UnixFileSystem.checkAccess(UnixFileSystem.java:251)
at java.io.File.exists(File.java:815)
at android.app.ContextImpl.getDataDir(ContextImpl.java:2237)
at android.app.ContextImpl.getPreferencesDir(ContextImpl.java:550)
at android.app.ContextImpl.getSharedPreferencesPath(ContextImpl.java:747)
at android.app.ContextImpl.getSharedPreferences(ContextImpl.java:400)
at android.content.ContextWrapper.getSharedPreferences(ContextWrapper.java:174)
at android.content.ContextWrapper.getSharedPreferences(ContextWrapper.java:174)
at android.support.v7.preference.PreferenceManager.getSharedPreferences(PreferenceManager.java:330)

最佳答案

SharedPreferences 在第一次访问时从磁盘读取,然后缓存在内存中,因此您的 DiskReadViolation 处于严格模式。

虽然将所有 I/O 作为非阻塞主线程运行是理想的,但即使您在 Google Apps 上启用严格模式,您也会在应用程序启动时看到红色闪烁,因此您可能无法轻松绕过您的违反严格模式。

您要关心的主要事情是在主线程上运行的长时间运行的 HTTP 请求或长时间运行的数据库操作 - 这些都是要避免的,解决方案涉及使用类似 AsyncTask 的东西、RxJava 或 Kotlin 协程。

目前,SharedPreference 和关联的 setPreferenceFromResource 具有您无法控制的操作模式,因此您不太可能通过添加异步代码来使事情变得更好这些。

关于android - 当启动严格模式并将 `android:persistent`设置为 `true`时会出错。我该如何解决这个错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50665230/

39 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com