android - 在单独的线程上访问 SharedPreferences

标签 android multithreading sharedpreferences

如果您使用 apply,在单独的线程中编辑共享首选项是否多余?

我的 MainActivity 的 onCreate 方法中有以下代码块:

    final MainActivity activityReference = this;

    Executors.newSingleThreadExecutor().execute(new Runnable() {
        @Override
        public void run() {

            // if it is the first time running
            SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(activityReference);
            if(!prefs.getBoolean(MainActivity.FIRST_LOAD, false)) {

                // enable a setting on first run                    

                SharedPreferences.Editor editor = prefs.edit();
                editor.putBoolean(MainActivity.FIRST_LOAD, true);
                editor.apply();
            }

        }
    });

因为 SharedPreferences.Editor 的实例正在调用 apply 方法,所以它应该是异步的,但在单独的线程中运行之前,我们仍然会违反严格模式。违规是 StrictModeDiskRead 违规,因此假设它们是由于获取 SharedPreferences 而不是调用 apply。此外,三星设备似乎几乎完全有这个问题。

最佳答案

Is editing shared preferences in a separate thread redundant if you use apply?

是的,但请记住,您可能不会在编辑 SharedPreferences。您可能也在阅读它们。

鉴于您的代码的性质,我猜您将其称为 LAUNCHER Activity 中的第一件事。如果是这样,那么其他任何东西都不会检索到那些 SharedPreferences,因此您将在读取时从 StrictMode 获得磁盘读取违规,而不是编辑。

既然你已经有了后台线程,我会切换到 commit() 而不是使用 apply() 并浪费另一个线程。

关于android - 在单独的线程上访问 SharedPreferences,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25167952/

相关文章:

带有圆形颜色、背景图像和选择器的 Android 按钮

multithreading - 后台工作人员中的 WriteableBitmap

java - 即使在同步后仍存在竞争条件

android - Activity.recreate() 复制列表

java - 错误 : Element value must be a constant expression

java - 如何使用 Firebase 结果检索 ListView 中的位置

android - 我在哪里可以找到 MBProgressHUD 之类的库,适用于 ios,但适用于 android?

android - AsyncQueryHandler 在 ui 线程上调用 onQueryComplete? ( 安卓 )

java - 在 Android 中,在应用程序的整个持续时间内保留从应用程序上下文创建的 SharedPreferences 对象是否存在问题?

android - 取消偏好更改