为什么 apply() 并不比 SharedPreferences.Editor 中的 commit() 快


我刚刚了解了 SharedPreferences.Editor 的 apply() 和 commit() 之间的区别。 apply() 据说是异步的,可以在 UI 线程上运行是

安全的;commit() 据说是同步的,不适合在 UI 线程上运行。所以我在 MainActivity 中使用点击侦听器做了一个简单的测试:

SharedPreferences sharedPreferences = MainActivity.this.getSharedPreferences("synced", 0);
SharedPreferences.Editor editor = sharedPreferences.edit();
for (int i = 0; i < 100000; ++i) {
    editor.putString("index" + i, "index" + i);
}
Log.e("Test", System.nanoTime() + " SYNC ");
editor.commit();
Log.e("Test", System.nanoTime() + " SYNC " + sharedPreferences.getString("index99999", "NULL"));
SharedPreferences sharedPreferences2 = MainActivity.this.getSharedPreferences("asynced", 0);
SharedPreferences.Editor editor2 = sharedPreferences2.edit();
for (int i = 0; i < 100000; ++i) {
    editor2.putString("index2" + i, "index2" + i);
}
Log.e("Test", System.nanoTime() + " ASYNC ");
editor2.apply();
Log.e("Test", System.nanoTime() + " ASYNC " + sharedPreferences2.getString("index299999", "NULL"));

我运行了几次并收到了相同的结果,如下所示:

05-25 01:11:44.608 16109-16109/darklord.preferencestest E/Test: 1295614410392 SYNC 
05-25 01:11:44.667 16109-16109/darklord.preferencestest E/Test: 1295669350041 SYNC index99999
05-25 01:11:45.257 16109-16109/darklord.preferencestest E/Test: 1296262306521 ASYNC 
05-25 01:11:45.317 16109-16109/darklord.preferencestest E/Test: 1296317374397 ASYNC NULL

我希望 apply() 必须更快地提交 commit(),但结果证明它们是相同的。它们都不适合在 ui 线程上运行。那么为什么会这样呢?

编辑:日志应为

05-25 01:11:44.608 16109-16109/darklord.preferencestest E/Test: 1295614410392 SYNC 
05-25 01:11:44.667 16109-16109/darklord.preferencestest E/Test: 1295669350041 SYNC index99999
05-25 01:11:45.257 16109-16109/darklord.preferencestest E/Test: 1296262306521 ASYNC 
05-25 01:11:45.317 16109-16109/darklord.preferencestest E/Test: 1296317374397 ASYNC index249999

我正在模拟器 api 17 上进行测试。

问题是您正在从内存中读回值

您之前创建的SharedPreference

根据文件,

apply() 将其更改提交到内存中的共享首选项 立即启动异步提交到磁盘

因此,内存中SharedPreference将立即更新。

最新更新