对于一个小的需求,我需要清除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()调用是如何异步工作的。他们会在队列中批量处理呼叫吗?
谢谢。
答案 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