通过SharedPreferences实现进程间数据共享的问题详解
2015-10-29 10:44
731 查看
之前为了解决应用的内存压力,在同一个应用中使用了多进程,但在程序自测的过程中发现不同进程之间的SharedPreferences数据不能共享,但应用内很多数据都是通过SharedPreferences来保存的,如果改成其它多进程通信的方式改动比较大。通过查看源码发现,在API Level>=11即Android 3.0可以通过Context.MODE_MULTI_PROCESS属性来实现SharedPreferences多进程共享,具体使用方式如下: SharedPreferences sp = context.getSharedPreferences(FILE_NAME,
Context.MODE_MULTI_PROCESS);
SharedPreferences时间进程间数据共享会导致的问题 本来以为通过MODE_MULTI_PROCESS属性使用SharedPreferences就可以解决不同进程之间不能共享数据的问题了,但SQA总是反馈一些随机但出现频率比较大的bug,比如在使用过程中没有清除程序数据的前提下,会出现欢迎界面和操作指引,这是通过保存在SharedPreferences的标志来判断用户是否是第一次启动程序的,分析发现保存在SharedPreferences中的数据丢失了,但代码中并没有去清除这些数据,所以推测可能是不同进程同一时间对SharedPreferences操作导致的,经验证确实如此,去掉多进程就不会再出现这个问题了。
Context.MODE_MULTI_PROCESS);
SharedPreferences时间进程间数据共享会导致的问题 本来以为通过MODE_MULTI_PROCESS属性使用SharedPreferences就可以解决不同进程之间不能共享数据的问题了,但SQA总是反馈一些随机但出现频率比较大的bug,比如在使用过程中没有清除程序数据的前提下,会出现欢迎界面和操作指引,这是通过保存在SharedPreferences的标志来判断用户是否是第一次启动程序的,分析发现保存在SharedPreferences中的数据丢失了,但代码中并没有去清除这些数据,所以推测可能是不同进程同一时间对SharedPreferences操作导致的,经验证确实如此,去掉多进程就不会再出现这个问题了。
解决方案
由于进程间是不能内存共享的,每个进程操作的SharedPreferences都是一个单独的实例,上述的问题并不能通过锁来解决,这导致了多进程间通过SharedPreferences来共享数据是不安全的,这个问题只能通过多进程间其它的通信方式或者是在确保不会同时操作SharedPreferences数据的前提下使用SharedPreferences来解决。可以参考这个项目 https://github.com/seven456/MultiprocessSharedPreferences参考资料
stackoverflowUse SharedPreferences on multi-process mode相关文章推荐
- Node.js中child_process实现多进程
- Linux BASH多进程并行处理的方法实现
- c语言多进程tcp服务器示例
- PHP的pcntl多进程用法实例
- 以实例全面讲解PHP中多进程编程的相关函数的使用
- 深入探究PHP的多进程编程方法
- Android开发中4个常用的工具类【Toast、SharedPreferences、网络及屏幕操作】
- 深入解析PHP中的(伪)多线程与多进程
- 用map函数来完成Python并行任务的简单示例
- python 多进程通信模块的简单实现
- python多进程操作实例
- python基于multiprocessing的多进程创建方法
- Python多进程机制实例详解
- android中使用SharedPreferences进行数据存储的操作方法
- Python多进程编程技术实例分析
- Python多进程并发(multiprocessing)用法实例详解
- Nginx服务器进程数设置和利用多核CPU的方法
- php开启多进程的方法
- Mpass – PHP做Socket服务的解决方案
- SharedPreferences详解