取代SharedPreferences的多進程解決方案(轉載)

轉載自:《取代SharedPreferences的多進程解決方案》


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

SharedPreferences不支持多進程

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

用ContentProvider來取代SharedPreferences 心路歷程

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

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

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

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

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

做完了這些以後, 發現可以做一個像Tray一樣的庫, 更簡單, 造福其他人, 那麼何樂而不爲呢.

PreferencesProvider優勢

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

有用的工具

生成ContentProvider相關代碼:
BoD/android-contentprovider-generator
只要定義數據庫基本信息, 在json中定義表結構, 就可以生成所有相關代碼.

查看數據庫:
Stetho
在Chrome中像調試網頁一樣看Android應用的資源, 這個真是太好用了.

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



沉璧浮光的補充:

另一個相同功能的項目:XSharedPref




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章