zoukankan      html  css  js  c++  java
  • Android中SharedPreference多进程数据共享出错

    http://my.oschina.net/zhibuji/blog/195097

    主要解决: 在android中,多个进程对同一个sharedpreference进行修改,总会有一个进程获取到的结果不是实时修改后的结果。
    
    SharedPreference作为android五大存储(网络,数据库,文件,SharedPreference,contentProvider)之中最方便使用的一个,从类名上来看就不是一个存储大数据的工具,以key/value成对的形式来存储基本数据类型,只能存储基本数据类型。文件存放在/data/data/your   packagename/shared_prefs目录下。
    
    文件存储格式如下:
    
    <?xml version=’1.0’ encoding=’utf-8’standalone=’yes’   ?>
    
    <map>
    
    <boolean name=“key” value=”true”/>
    
    <string name=”key”>hello</string>
    
    </map>
    
    SharedPreference最适合使用的地方就是保持配置信息,Android中专门有针对偏好设置的PreferenceFragment中的数据存储也是使用SharePreference来存储,默认的文件名为(your   packagename)_preferences.xml中。如果要修改默认文件名,可以通过在PreferenceFragment中使用getPreferenceManager().setSharedPreferencesName(“modify_default_preference”)来更改默认文件名。
    
    这些都不重要哈,重要的是在多进程中修改同一个值出现的问题。为了方便描述,将第一次创建某个SharedPreference xml的进程描述为为主进程,次使用该xml文件的为次进程
    
    不同进程是指在ddms中看到的不同进程,包括不同应用(shareduid同样在内哦),同一个应用中配置process产生的次进程。他们之间进行通信都会造成主进程修改值之后,在次进程读取到的还是第一次初始化时读取到的值。目前网络上还没有很好的解决办法,我的解决办法如下:
    
    1、首先要将获取SharedPreference的MODE设置为: MODE_MULTI_PROCESS 。其值为4(2.3以后有该属性)。如:   getSharedPreferences("test_aa", MODE_MULTI_PROCESS);.如果是使用MODE_PRIVATE这种模式,那么另一个进程中写入的值,将不会写到文件中。
    
    2、其次为了保证修改数据实时提交到磁盘,不要将SharedPreference设置成成员变量,尽量在哪里修改就在哪里直接获取SharedPreference,修改后别忘记commit。
    
     
    
    如果做到了上面两点,不出意外的话,数据就可以做到实时修改了。如果为了方便已经写了SharedPreference编辑的工具类,那么第二点基本就做不到了,so,需要做第三步。
    
    
    3、如果两个进程都需要适时读取或根据该值进行逻辑操作,那么最好在两个进程中都进行Editor操作。可以使用Service和aidl技术,aidl对于这种基本类型的传递so easy。
  • 相关阅读:
    laravel phpstorm IDE 代码提示
    vue的样式绑定
    asp.net mvc视图中使用entitySet类型数据时提示出错
    Linq to SQL 中将数字转换为字符串
    jquery submit()不能提交表单的解决方法
    命名空间“System.Web”中不存在类型或命名空间名称“Optimization”(是否缺少程序集引用?)
    没有为扩展名“.cshtml”注册的生成提供程序
    WP REST API: 设置和使用OAuth 1.0a Authentication(原文)
    解决"要执行请求的操作,WordPress需要访问您网页服务器的权限"
    Mysql添加用户错误:ERROR 1364 (HY000): Field 'ssl_cipher' doesn't have a default value解决方法
  • 原文地址:https://www.cnblogs.com/zhengtu2015/p/5239785.html
Copyright © 2011-2022 走看看