当启动严格模式并将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())
}
首选项示例.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>
首选片段:
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)
2条答案
按热度按时间i7uq4tfw1#
SharedPreferences
在第一次访问时从磁盘读取,然后缓存在内存中,因此DiskReadViolation
处于严格模式。虽然以非阻塞方式运行主线程的所有I/O是理想的,但即使您在Google Apps上启用了严格模式,您也会在应用启动时看到红色 Flink ,因此您可能无法轻松绕过严格模式违规。
您需要关注的主要问题是主线程上运行的长时间HTTP请求或长时间数据库操作-这些都是要避免的,解决方案涉及使用
AsyncTask
、RxJava或Kotlin协程。目前,
SharedPreference
和关联的setPreferenceFromResource
具有您无法控制的操作模式,因此您不太可能通过围绕这些操作模式添加异步代码来使事情变得更好。hs1ihplo2#
我同意另一个答案,对此你无能为力。但是,这不应该阻止你在应用的其他部分使用
StrictMode
。要忽略StrictMode
的特定代码路径,请使用以下模式: