对于一个小的需求,我需要清除SharedPreferences并在调用之后立即保存一个int值 . 但是,保存int值并不一致 .
sharedPreference = context.getSharedPreferences("pet-app-sp", Context.MODE_PRIVATE);
editor = sharedPreference.edit();
editor.clear().apply();
editor.putInt(VERSION_NUMBER_PREFERENCE_KEY, versionCode).apply();
所以,我想了解apply()调用是如何异步工作的 . 他们是否在队列中批量调用?
谢谢 .
1 回答
不,他们没有 .
SharedPreferences
被开发用于执行非常基本的任务 ..apply()
应该只是使用SharedPreferences
时的最后一个语句 . 所以你可以像这样重构你的代码您还应该知道
commit()
和apply()
之间的区别apply()
在2.3中添加,它提交时不返回表示成功或失败的布尔值 .如果保存有效,则
commit()
返回true,否则返回false .apply()
被添加,因为Android开发团队注意到几乎没有人注意到返回值,因此应用速度更快,因为它是 asynchronous .基本上,
commit()
立即将更改的SharedPreference
值写入持久存储,另一方面,apply()
立即将更改写入内存SharedPreference
并启动异步提交到磁盘 . 这就是为什么在apply()
的情况下,您将不会收到有关更改失败或成功的通知,例如commit()
,它会返回您更改的状态 . Source关于评论中的问题:
这可能听起来很模糊,但有时当在异步中工作时,你可以控制线程或它们的队列,因为它是异步的,有两种语句的顺序可以改变的有效可能性 . 这就是为什么甚至Vladyslav Matviienko(在问题的评论部分)建议你使用
commit()
同步并自动调用clear()
或者你可以使用我的答案,即删除.apply()调用 . 检查documentation你一定在想为什么他们会搬到
.apply()
. 有时开发人员最终通过commit()
插入大量数据,这是同步的并最终冻结UI
/Main
Thread