Android SharePreference 在主进程和次进程间共享数据不同步出错
SharedPreference作为android五大存储(网络,数据库,文件,SharedPreference,contentProvider)之中最方便使用的一个,从类名上来看就不是一个存储大数据的工具,以key/value成对的形式来存储基本数据类型,只能存储基本数据类型。
在平时的开发中偶尔会遇到SharedPreference在多进程中修改同一个值出现的问题。多进程是指在ddms中看到的不同进程,包括不同应用(不管share uid 是否相同),同一个应用中配置android:process=""产生的多个进程。他们之间进行通信都会造成主进程修改值之后,在次进程读取到的还是第一次初始化时读取到的值。
我归纳总结的解决办法如下:
1、首先要将获取SharedPreference的MODE设置为: MODE_MULTI_PROCESS 。其值为4(2.3以后有该属性)。如: getSharedPreferences("file_test", MODE_MULTI_PROCESS);.如果是使用MODE_PRIVATE这种模式,那么另一个进程中写入的值,将不会写到文件中。
2、其次为了保证修改数据实时提交到磁盘,不要将SharedPreference设置成成员变量,尽量在哪里修改就在哪里直接获取SharedPreference,修改后别忘记commit。
如果做到了上面两点,不出意外的话,数据就可以做到实时修改了。
3、如果两个进程都需要适时读取或根据该值进行逻辑操作,那么最好在两个进程间使用Service和aidl技术,aidl对于这种基本类型的传递很容易。
最后:对于分享数据来说:如果是瞬时分享数据,不需要长期保存的话可以使用广播。如果要分享大量数据的话使用 ContentProvider是最好的选择。
Android SharePreference 在主进程和次进程间共享数据不同步出错的更多相关文章
- python 进程间共享数据 (一)
def worker(num, mystr, arr): num.value *= 2 mystr.value = "ok" for i in range(len(arr)): a ...
- 【C++】DLL内共享数据区在进程间共享数据(重要)
因项目需要,需要在DLL中共享数据,即DLL中某一变量只执行一次,在运行DLL中其他函数时该变量值不改变:刚开始想法理解错误,搜到了DLL进程间共享数据段,后面发现直接在DLL中定义全局变量就行,当时 ...
- python 进程间共享数据 (二)
Python中进程间共享数据,除了基本的queue,pipe和value+array外,还提供了更高层次的封装.使用multiprocessing.Manager可以简单地使用这些高级接口. Mana ...
- 【转】VC 利用DLL共享区间在进程间共享数据及进程间广播消息
1.http://blog.csdn.net/morewindows/article/details/6702342 在进程间共享数据有很多种方法,剪贴板,映射文件等都可以实现,这里介绍用DLL的共享 ...
- 使用DLL在进程间共享数据
0x01 DLL在进程间共享数据理论 1.可以在Dll中使用#pragma data_seg建立共享类型的数据段将需要共享的数据分离出来,放置在一个独立的数据段里,并把该段的属性设置为共享,从而实现不 ...
- 使用 WM_COPYDATA 在进程间共享数据
开发中有时需要进程间传递数据,比如对于只允许单实例运行的程序,当已有实例运行时,再次打开程序,可能需要向当前运行的实例传递信息进行特殊处理.对于传递少量数据的情况,最简单的就是用SendMessage ...
- 进程间共享数据Manager
一.前言 进程间的通信Queue()和Pipe(),可以实现进程间的数据传递.但是要使python进程间共享数据,我们就要使用multiprocessing.Manager. Manager()返回的 ...
- windows核心编程之进程间共享数据
有时候我们会遇到window进程间共享数据的需求,例如说我想知道系统当前有多少某个进程的实例. 我们能够在程序中定义一个全局变量.初始化为0.每当程序启动后就加1.当然我们我们能够借助第三方介质来储存 ...
- Python multiprocessing.Manager介绍和实例(进程间共享数据)
Python中进程间共享数据,处理基本的queue,pipe和value+array外,还提供了更高层次的封装.使用multiprocessing.Manager可以简单地使用这些高级接口. Mana ...
随机推荐
- SQLSERVER20008 完整备份和差异备份
--差异备份 DIFFERENTIAL ) ),)+'.bak' BACKUP DATABASE [testbackup] TO DISK=@name WITH DIFFERENTIAL, NOFOR ...
- Fiddler-010-网络延时应用小技巧-模拟低网速环境
在日常的网络测试中,经常需要测试网络超时或在网络传输速率不佳的情况的应用场景,而与此同时我们有时手边资源有限,实现在各种真实网络(2G\3G)环境下测试有些局限性.其实 fiddler 已经提供了类似 ...
- spring记录
context:property-placeholder 是将properties加载到Spring上下文中,接下来在定义bean的时候就能用${xx.xx}来访问了. util:properties ...
- bat批处理完成jdk tomcat的安装
在完成一个web应用项目后,领导要求做一个配置用的批处理文件,能够自动完成jdk的安装,tomcat的安装,web应用的部署,环境变量的注册,tomcat服务的安装和自动启动 参考了网上很多的类似的批 ...
- Android-项目介绍
一个.net开发人员 在了解android项目只能凭自己的理解慢慢来了! 新建项目 右击 New-JAVA Application Project 傻瓜似的下一步骤填写每一步 文件介绍 Android ...
- Python之路-python(常用模块学习)
模块介绍 time &datetime模块 random os sys shutil shelve xml处理 yaml处理 configparser hashlib re正则表达式 1.模块 ...
- [Android Tips] 2. Disable recent apps dialog on long press home button
public void onWindowFocusChanged(boolean hasFocus) { super.onWindowFocusChanged(hasFocus); Log.d(&qu ...
- EF CodeFirst 如何通过配置自动创建数据库<当模型改变时>
最近悟出来一个道理,在这儿分享给大家:学历代表你的过去,能力代表你的现在,学习代表你的将来. 十年河东十年河西,莫欺少年穷 学无止境,精益求精 本篇为进阶篇,也是弥补自己之前没搞明白的地方,惭愧 ...
- 匹配所有不可见元素,或者type为hidden的元素
查找隐藏的 tr HTML 代码: <table> <tr style="display:none"><td>Value 1</td> ...
- php strrpos()与strripos()函数不同之处在哪里呢
strripos() 函数 定义和用法strripos() 函数查找字符串在另一个字符串中最后一次出现的位置.如果成功,则返回位置,否则返回 false.语法strrpos(string,find,s ...