首页 文章

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

提问于
浏览 1530
1

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

  • 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开发团队注意到几乎没有人注意到返回值,因此应用速度更快,因为它是 asynchronous .

    基本上, commit() 立即将更改的 SharedPreference 值写入持久存储,另一方面, apply() 立即将更改写入内存 SharedPreference 并启动异步提交到磁盘 . 这就是为什么在 apply() 的情况下,您将不会收到有关更改失败或成功的通知,例如 commit() ,它会返回您更改的状态 . Source

    关于评论中的问题:

    为什么问题中的代码不起作用 . 同样,为什么对.apply()的两个连续调用不起作用?

    这可能听起来很模糊,但有时当在异步中工作时,你可以控制线程或它们的队列,因为它是异步的,有两种语句的顺序可以改变的有效可能性 . 这就是为什么甚至Vladyslav Matviienko(在问题的评论部分)建议你使用 commit() 同步并自动调用 clear() 或者你可以使用我的答案,即删除.apply()调用 . 检查documentation

    你一定在想为什么他们会搬到 .apply() . 有时开发人员最终通过 commit() 插入大量数据,这是同步的并最终冻结 UI / Main Thread

相关问题