Android中SharedPreference多進程數據共享出錯

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

主要解決: 在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。
相關文章
相關標籤/搜索