android - addPreferencesFromResource() 在 Android 上导致 StrictMode 违规
问题描述
我几乎没有PreferenceFragmentCompat
从“preference-v8-28.0.0”扩展类的片段。为了膨胀视图,我使用addPreferencesFromResource(..)
如下:
@Override
public void onCreatePreferences(Bundle bundle, String key)
{
readKeys();
addPreferencesFromResource(R.xml.preference_general);
bindPreferences();
}
在启用 StrictMode 的情况下检查它,如下所示:
private void enabledStrictMode()
{
StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
.detectAll()
.penaltyLog()
.penaltyDeath()
.build());
StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
.detectAll()
.penaltyLog()
.penaltyDeath()
.build());
}
我有一个 ThreadMode 违规:
2020-08-26 17:44:21.877 17990-17990 D/StrictMode: StrictMode policy violation; ~duration=471 ms: android.os.StrictMode$StrictModeDiskReadViolation: policy=327743 violation=2
at android.os.StrictMode$AndroidBlockGuardPolicy.onReadFromDisk(StrictMode.java:1438)
at java.io.UnixFileSystem.checkAccess(UnixFileSystem.java:251)
at java.io.File.exists(File.java:807)
at android.app.ContextImpl.getDataDir(ContextImpl.java:2181)
at android.app.ContextImpl.getPreferencesDir(ContextImpl.java:504)
at android.app.ContextImpl.getSharedPreferencesPath(ContextImpl.java:698)
at android.app.ContextImpl.getSharedPreferences(ContextImpl.java:366)
at android.content.ContextWrapper.getSharedPreferences(ContextWrapper.java:167)
at android.content.ContextWrapper.getSharedPreferences(ContextWrapper.java:167)
at android.support.v7.preference.PreferenceManager.getSharedPreferences(PreferenceManager.java:331)
at android.support.v7.preference.Preference.getSharedPreferences(Preference.java:1213)
at android.support.v7.preference.Preference.dispatchSetInitialValue(Preference.java:1561)
at android.support.v7.preference.Preference.onAttachedToHierarchy(Preference.java:1293)
at android.support.v7.preference.Preference.onAttachedToHierarchy(Preference.java:1305)
at android.support.v7.preference.PreferenceGroup.addPreference(PreferenceGroup.java:260)
at android.support.v7.preference.PreferenceGroup.addItemFromInflater(PreferenceGroup.java:181)
at android.support.v7.preference.PreferenceInflater.rInflate(PreferenceInflater.java:363)
at android.support.v7.preference.PreferenceInflater.inflate(PreferenceInflater.java:170)
at android.support.v7.preference.PreferenceInflater.inflate(PreferenceInflater.java:120)
at android.support.v7.preference.PreferenceManager.inflateFromResource(PreferenceManager.java:138)
at android.support.v7.preference.PreferenceFragmentCompat.addPreferencesFromResource(PreferenceFragmentCompat.java:429)
at org.company.libproject.android.settings.GeneralSettingsFragment.onCreatePreferences(GeneralSettingsFragment.java:106)
at android.support.v7.preference.PreferenceFragmentCompat.onCreate(PreferenceFragmentCompat.java:228)
at org.company.libproject.android.settings.BaseSettingsFragment.onCreate(BaseSettingsFragment.java:90)
at org.company.libproject.android.settings.GeneralSettingsFragment.onCreate(GeneralSettingsFragment.java:91)
at android.support.v4.app.Fragment.performCreate(Fragment.java:2414)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1418)
at android.support.v4.app.FragmentTransition.addToFirstInLastOut(FragmentTransition.java:1195)
at android.support.v4.app.FragmentTransition.calculateFragments(FragmentTransition.java:1078)
at android.support.v4.app.FragmentTransition.startTransitions(FragmentTransition.java:117)
at android.support.v4.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2408)
at android.support.v4.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManager.java:2366)
at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:2273)
at android.support.v4.app.FragmentManagerImpl.dispatchStateChange(FragmentManager.java:3273)
at android.support.v4.app.FragmentManagerImpl.dispatchActivityCreated(FragmentManager.java:3229)
at android.support.v4.app.FragmentController.dispatchActivityCreated(FragmentController.java:201)
at android.support.v4.app.FragmentActivity.onStart(FragmentActivity.java:620)
at android.support.v7.app.AppCompatActivity.onStart(AppCompatActivity.java:178)
at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1333)
at android.app.Activity.performStart(Activity.java:6992)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2780)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2892)
at android.app.ActivityThread.-wrap11(Unknown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1593)
at android.os.Handler.dispatchMessage(Handler.java:105)
at android.os.Looper.loop(Looper.jav
有点期望它会读取一个 XML 文件 = 主线程上发生的 IO 操作。为什么会被视为违规?onCreate(..)
与setContentView(..)
[不违反它]夸大其观点的任何活动在概念上有何区别?
什么是不违反的正确方法?我是否应该忽略它并放松 StrictMode 检查(我真的很想避免这样做)?
PS。我知道现在不推荐使用“支持库”以支持“androidx 库”,但我想它也与它有关。无论如何,我目前正在寻找适用于支持库的适当解决方案。
解决方案
推荐阅读
- android - 如何使 iOS 和 android 中的字体大小相等?
- apache-kafka - Logstash 在其输出中显示奇怪的字符
- azure - 未配置 azure kubernetes 仪表板
- mysql - 如何确定是否将在不使用触发器或表定义的更新查询中更新行
- location - 使用不同的位置请求模式检索位置时出现问题
- google-cloud-platform - 服务帐号需要哪些预定义的 IAM 角色才能完成 Google Cloud Run 快速入门:构建和部署?
- javascript - 在 Highcharts 中放大和缩小某些 x 轴值不显示
- kubernetes - 如何在 k8s 集群外暴露服务?
- python-3.x - 如何使用python3从只有日期格式的嵌套列表中识别列表?
- html - 用于扩展中间元素的 CSS,保持其他元素固定并在 flexbox 中组合在一起