文章目录
- 一、前言
- 二、问题背景
- 三、问题定位
- 四、问题解决
一、前言
在上周开发时遇到一个问题,记录一下:
首先描述一下应用场景:
- 使用sharedPreference进行存储,命名为a.xml,这里简称为a文件
- 有两个服务,一个是往a文件中写入数据,另一个是从a文件中取数据。(这两个服务都被我设置了属性:android:process=“:updateProcess”,android:process=“:uploadProcess”)
- 发现问题: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属性都去掉,就解决了设备状态延迟更新的问题。
但是如果以后需要将服务另放一个进程里运行呢?或者说当以后两个进程想同时对一个持久化存储的资源进行读写操作呢?
我认为可以考虑使用ContentProvider,这应当是一个可行的思路,ContentProvider内部实现了对于多进程读写访问的支持,后续有空也可以尝试对ContentProvider的源码进行了解和学习记录。