使用SharedPreferences保存数据数据取出延迟或丢失的问题

本文介绍了在使用SharedPreferences进行跨进程状态同步时遇到的数据丢失或延迟问题,并详细解释了不同访问模式的区别,最后给出了正确的设置方法。

SharedPreferences更改数据后多处读取,数据丢失或延时的问题的原因和解决办法

先说一下遇到这个问题的场景,由于我的项目中使用了SharePreference保存一个状态,然后通过获取这个状态来控制后面的逻辑,也就是这个状态是要频繁的去获取的,那势必对这个状态的更改后再重新获取的灵敏度依赖是很高的.然后就出现了这样一个问题,在主进程的某个文件中更改了这个状态后,主进程中可以很实时的获取到(这个我是调试了很久才发现的,因为我有多个地方获取了这个状态,并且他们还是分布在不同的进程中),而其他非主进程的地方获取不到,而且只要程序不杀掉重新启动,那么它获取的就一直是上一次保存的状态.然后我就去找SharePreference的资料去查,找了很久终于找到一个和我遇到的这个问题很相似的解释,所以这里记录下来,以便后续复习,也方便还有遇到这个问题的人能更快速的解决问题.

这个问题主要是创建SharedPreferences文件时设置的MODE类型导致的,我平时代码中创建的SharedPreferences文件的类型都是MODE_PRIVATE也就是0,也没有很详细的了解getSharedPreferences(name, mode)这个方法后面的mode的作用,那下面我就根据我查询的资料来说一下getSharedPreferences(name, mode)的mode的种类以及使用场景
  1. MODE_PRIVATE:代表私有访问模式,在Android 2.3及以前这个访问模式是可以跨进程的,之后的版本这个模式就只能访问同一进程下的数据.

  2. MODE_MULTI_PROCESS:在Android 2.3及以前,这个标志位都是默认开启的,允许多个进程访问同一个SharedPrecferences对象。而以后的Android版本,必须通过明确的将MODE_MULTI_PROCESS这个值传递给mode参数,才能开启多进程访问。

  3. MODE_WORLD_READABLE: 表示当前文件可以被其他应用读取

  4. MODE_WORLD_WRITEABLE: 表示当前文件可以被其他应用写入

  5. MODE_APPEND: 追加方式存储

所以我的代码里里在getSharePreference这个方法里的模式设置为MODE_MULTI_PROCESS就解决了问题.
### 如何在 Android使用 SharedPreferences 保存数据 #### 创建和获取 SharedPreferences 实例 为了操作 `SharedPreferences`,首先需要获得其实例。通常有两种方式来创建访问已有的 `SharedPreferences` 文件: - 使用默认名称:通过调用 `Context.getSharedPreferences(String name, int mode)` 方法可以指定文件名以及打开模式(通常是私有模式)。如果该文件不存在,则会自动创建一个新的。 ```java // 获取名为 "login_prefs" 的 SharedPreferences 对象,在 Activity Service 中可以直接使用 getApplicationContext() SharedPreferences sharedPreferences = context.getSharedPreferences("login_prefs", Context.MODE_PRIVATE); ``` - 应用级别的共享首选项:也可以直接利用上下文对象提供的方法 `getPreferences(int mode)` 来快速得到当前组件关联的 `SharedPreferences` 文件。 #### 写入数据SharedPreferences 当有了 `SharedPreferences.Editor` 编辑器之后就可以向其中写入键值对形式的数据了。编辑完成后记得要提交更改以便生效。这可以通过两种方式进行——同步执行 (`commit()`) 和异步执行 (`apply()`)[^1]。 ```java // 获得 Editor 对象用于修改 SharedPreference 数据 SharedPreferences.Editor editor = sharedPreferences.edit(); // 向 SharedPreferences 添加一些基本类型的值 editor.putString("username", "JohnDoe"); editor.putInt("age", 28); // 提交变更 apply() 是非阻塞式的而 commit() 则返回布尔型表示成功与否 editor.apply(); ``` #### 读取存储于 SharedPreferences 中的数据 从 `SharedPreferences` 中提取之前存入的信息非常简单,只需要提供相应的 key 就能轻松取得 value 值。对于每种类型都有专门的方法来进行查询,比如 `getString()`, `getInt()` 等等。 ```java String username = sharedPreferences.getString("username", ""); // 第二参数为找不到key时使用的默认值 int age = sharedPreferences.getInt("age", -1); // 默认值设为非法数值方便判断是否存在此条目 ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值