SharedPreferences如何处理一个接一个的多个.apply()调用?

时间:2018-12-10 09:15:13

标签: android sharedpreferences

对于一个小的需求,我需要清除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 个答案:

答案 0 :(得分:3)

  

他们是否将呼叫分批排队?

不,他们没有。 SharedPreferences被开发来执行非常基本的任务。 .apply()应该仅是与SharedPreferences一起使用时的最后一条语句。这样您就可以重构代码了

sharedPreference = context.getSharedPreferences("pet-app-sp", Context.MODE_PRIVATE);
editor = sharedPreference.edit();
editor.clear(); //removed apply
editor.putInt(VERSION_NUMBER_PREFERENCE_KEY, versionCode).apply();

您还应该了解commit()apply()之间的区别

apply()是在2.3中添加的,它的提交没有返回表示成功或失败的布尔值。

commit()如果保存有效,则返回true,否则返回false。

添加

apply()是因为Android开发团队注意到几乎没有人注意到返回值,因此由于异步而使apply更快。

基本上,commit()立即将更改后的SharedPreference值写到持久性存储中,另一方面,apply()立即将更改写到内存SharedPreference中,并启动对磁盘的异步提交。这就是为什么在apply()中,您不会像commit()那样收到更改失败或成功的通知,它会向您返回更改状态。 Source

关于评论中的问题:

  

为什么问题中的代码不起作用。像这样,为什么对.apply()的两个顺序调用不起作用?

这听起来似乎很模糊,但是有时在异步环境中工作时,您不确定自己是否在控制线程或它们的队列,因为您是异步的,因此不确定输出是否有效,因为有可能是两个的阶数陈述可以改变。这就是为什么甚至Vladyslav Matviienko(在问题的评论部分)建议您使用同步的commit()并自动调用clear()的原因,或者您可以使用我的答案,即删除.apply()调用。 检查documentation

您必须考虑为什么他们搬到.apply()。有时,开发人员最终通过同步的commit()插入了大量数据,最终冻结了UI / Main Thread