共享内存 —— 通过SharedPreferences实现进程间数据共享的问题详解
来源:互联网 发布:mate10使用感受知乎 编辑:程序博客网 时间:2024/05/21 18:37
博客源址:http://blog.csdn.net/offbye/article/details/49488113
2015-10-29 10:44
之前为了解决应用的内存压力,在同一个应用中使用了多进程,但在程序自测的过程中发现不同进程之间的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操作导致的,经验证确实如此,去掉多进程就不会再出现这个问题了。
解决方案
由于进程间是不能内存共享的,每个进程操作的SharedPreferences都是一个单独的实例,上述的问题并不能通过锁来解决,这导致了多进程间通过SharedPreferences来共享数据是不安全的,这个问题只能通过多进程间其它的通信方式或者是在确保不会同时操作SharedPreferences数据的前提下使用SharedPreferences来解决。
可以参考这个项目 https://github.com/seven456/MultiprocessSharedPreferences
参考资料
- Use SharedPreferences on multi-process mode
- 共享内存 —— 通过SharedPreferences实现进程间数据共享的问题详解
- 通过SharedPreferences实现进程间数据共享的问题详解
- 不同进程通过共享内存实现数据共享
- 通过内存映射文件实现进程间数据共享
- 多进程开发过程中sharedpreferences 数据共享问题的解决方案——TrayPreferences
- 通过共享内存和信号量实现进程间的通信
- SharedPreferences 数据共享问题
- 共享内存实现进程间大数据的交换
- 共享内存实现进程间大数据的交换
- 共享内存实现进程间大数据的交换
- 共享内存实现进程间大数据的交换
- 共享内存实现进程间大数据的交换
- 共享内存实现进程间大数据的交换
- 共享内存实现进程间大数据的交换
- 共享内存实现进程间大数据的交换
- 共享内存实现进程间大数据的交换
- 共享内存实现进程间大数据的交换
- 共享内存实现进程间大数据的交换
- Supporting Different Screen Sizes
- linux面试积累
- [网址]IPM相关资料汇总
- Linux环境下Nginx安装及Ubuntu Server 15.0.4尝试安装Nginx
- 最全的常用正则表达式大全分享
- 共享内存 —— 通过SharedPreferences实现进程间数据共享的问题详解
- Android 下使用tcpdump网络抓包
- Dream Of Software Engineer
- android项目开发之单元测试
- Flume 1.4.0 NG 分布式集群搭建
- machine ID 问题
- UML视频
- AStar寻径算法
- GDI操作PNG图片