Android中关于SharedPreference参数的问题

一、前言

在上周开发时遇到一个问题,记录一下:
首先描述一下应用场景:

  1. 使用sharedPreference进行存储,命名为a.xml,这里简称为a文件
  2. 有两个服务,一个是往a文件中写入数据,另一个是从a文件中取数据。(这两个服务都被我设置了属性:android:process=“:updateProcess”,android:process=“:uploadProcess”
  3. 发现问题:a文件中可以正常更新数据,使用cat发现文件中数据能够被实时更新,但是取数据总是取的过时数据(即a中已更新的数据并没有被读数据的服务获取到)。

当时寻思没道理啊,取数据的服务只有可能去读取这个a文件,为什么取的总是过时数据呢?
(而且发现有时候取数据的服务也能取到更新后的数据,但是这种情况非常少)

二、问题背景

这个问题是我在做OTA功能开发中属性上报时遇到的,我打算用一个updateService服务将设备的若干属性保存于设备的sharedPreference文件中,用一个uploadService服务将这个文件中的数据读取出来然后上传到云平台。

a文件的数据更新是实时随着设备状态更新而更新的,但是读取a文件有问题。

三、问题定位

考虑是对于SharedPreference特性不清楚导致的,于是重新翻阅了第一行代码第二版:对于sharedPreference这样阐述:
在Context类中得到SharedPreference对象可以通过getSharedPreference方法。
回顾代码:
我是这样获取的SharedPreference对象,

SharedPreferences preferences = getSharedPreferences("otaModelInfo", MODE_PRIVATE);

MODE_PRIVATE参数表示只有当前的应用程序才可以对这个SharedPreferences文件进行读写,(这里应用程序我认为不恰当,可以阐述为进程)
然后再回顾到前面我是把这两个服务分别以两个进程来运行的,所以导致了在一个服务对其进行读写的时候,另一个服务是无法读写的。
而观察到其实有MODE_WORLD_READABLE、MODE_WORLD_WRITABLE,但是这些参数都被废弃了,可以推论:以前的android系统是可以支持多进程访问sharedPreference文件的。
这里给出第一行代码中的阐述
在这里插入图片描述

四、问题解决

现在就比较明了了,将两个服务的android:process属性都去掉,就解决了设备状态延迟更新的问题。


但是如果以后需要将服务另放一个进程里运行呢?或者说当以后两个进程想同时对一个持久化存储的资源进行读写操作呢?

不由得就想到了加锁,在这里,两个服务分别是两个进程,sharedPreference文件是一个临界资源,我们希望同一时刻只有一个进程对临界资源进行访问,所以可以考虑加锁。


其实可以考虑使用ContentProvider,这应当是一个可行的思路,ContentProvider内部实现了对于多进程读写访问的支持,后续有空也可以尝试对ContentProvider的源码进行了解和学习记录。


更新:
参考了《Android开发艺术探索》中:
SharedPreferences不支持两个进程同时写的操作,SharedPreferences底层是通过读/写XML文件来实现的,甚至并发读写也有可能出问题。
P64:面对高并发的读写访问,SharedPreferences有很大概率丢失数据,因此不建议在进程间通信中使用SharedPreferences。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值