取代SharedPreferences的多進程解決方案

Android的SharedPreferences用來存儲一些鍵值對, 但是卻不支持跨進程使用.
跨進程來用的話, 當(dāng)然是放在數(shù)據(jù)庫更可靠啦, 本文主要是給作者的新庫PreferencesProvider打個廣告.
這是一個用ContentProvider實現(xiàn)的, 可以像SharedPreferences一樣用于存儲鍵值對, 支持跨進程使用.

SharedPreferences不支持多進程

SharedPreferences對多進程的支持不好, 你用什么mode也沒用, 所以官方已經(jīng)廢棄了原先的MODE_MULTI_PROCESS, 并且建議跨進程存取值還是用ContentProvider之類的更靠譜一些.
說明見:
Context#MODE_MULTI_PROCESS

用ContentProvider來取代SharedPreferences 心路歷程

之前項目中為了解決跨進程存取值的問題, 找了一個解決方案: grandcentrix/tray, 感覺還挺好用.

我們最后一次用的版本是tray的v0.10.0, 因為項目發(fā)布以后后臺的崩潰里總是有相關(guān)的crash, 也是它的一個issue: https://github.com/grandcentrix/tray/issues/50
這個crash不是必現(xiàn)的, 概率比較低, 但是還是影響了一部分用戶, 當(dāng)我們解決了項目中的其他更重要的crash之后, 這個crash的排名就越來越靠前了.

后來作者做了一些改動, 說是在v0.11.0這個issue將會被修復(fù), 但是這個版本卻遲遲沒有發(fā)布, 似乎作者做了一些很大的改動.

為了及時補救, 不再讓用戶體驗到這個隨機的崩潰, 我們決定放棄等待Tray的下個版本, 自己實現(xiàn)用ContentProvider來存取preferences.

實現(xiàn)過程用了BoD/android-contentprovider-generator來生成ContentProvider相關(guān)的代碼.
我們把存preferences的表放在了自己的數(shù)據(jù)庫里, 然后借鑒了Tray的接口, 封裝了讀取方法, 使之用起來和SharedPreferences類似.
之后我們就用自己寫的新代碼全面取代了Tray, 當(dāng)然數(shù)據(jù)庫升級時還需要對原來存在Tray里的重要數(shù)據(jù)進行遷移.

做完了這些以后, 發(fā)現(xiàn)可以做一個像Tray一樣的庫, 更簡單, 造福其他人, 那么何樂而不為呢.

PreferencesProvider優(yōu)勢

  • 基于ContentProvider實現(xiàn), 支持跨進程使用;
  • 采用模塊化的管理方式, 可以將preferences分組管理;
  • 沒有Tray在v0.10.0版本的crash, 因為實現(xiàn)比Tray簡單, 沒有升級等功能.
    (其實在我們實際項目的使用中, 基本上用不到對存preferences的表進行數(shù)據(jù)庫升級的情況).
  • 使用方式簡單, 見項目README說明:PreferencesProvider.

有用的工具

生成ContentProvider相關(guān)代碼:
BoD/android-contentprovider-generator
只要定義數(shù)據(jù)庫基本信息, 在json中定義表結(jié)構(gòu), 就可以生成所有相關(guān)代碼.

查看數(shù)據(jù)庫:
Stetho
在Chrome中像調(diào)試網(wǎng)頁一樣看Android應(yīng)用的資源, 這個真是太好用了.

最后再次附上本文推薦的解決方案庫: PreferencesProvider

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容