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。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM