Android數據持久化(一) SharedPreferences

前言

前幾篇文章主要講了安卓四大組件之Activity。最近在coding的時候又遇到一個問題:自己項目中有兩個Activity分別命名爲Activity1和Activity2,而Activity1屬於process1,Activity2屬於process2,從Activity1跳轉到Activity2,然後在Activity2中通過使用SharedPreferences進行保存簡單的數據,結果不論怎麼操作所取的值都是不正確的,why??? 讀完本篇你將有所瞭解!
備註:本文主要從源碼角度進行分析。

簡介

SharedPreferences是Android平臺上一個輕量級的存儲輔助類,用來保存應用的一些常用配置,它提供了string,set,int,long,float,boolean六種數據類型。最終數據是以xml形式進行存儲。在應用中通常做一些簡單數據的持久化緩存。

流程圖

在這裏插入圖片描述

相關類簡介

1.PreferenceManager

Used to help create {@link Preference} hierarchies from activities or XML.

2.ContextImpl

Common implementation of Context API, which provides the base context object for Activity and other application components.

3.SharedPreferencesImpl

Implement SharedPreferences.

4.QueuedWork

he queued asynchronous work is performed on a separate, dedicated thread.

源碼分析

  1. 一般獲取SharedPreferences對象爲PreferenceManager getDefaultSharedPreferences() 或者ContextImpl getSharedPreferences(),不論是哪種最終都將進入ContextImpl getSharedPreferences()方法。
    在這裏插入圖片描述
    在這裏插入圖片描述
    在這裏插入圖片描述
    在這裏會先去獲取已經緩存到實例,如果爲空纔會去創建。
    在這裏插入圖片描述
    2.獲取到SharedPreferences對象後,調用get方法查詢數據。
    在這裏插入圖片描述
    這裏主要講一下awaitLoadedLocked(),等待sp創建完成以及load本地文件。
    在這裏插入圖片描述
    3.上面兩步將read過程梳理清楚,下面就write過程分析下。同樣還是先獲取SharedPreferences對象,然後調用put方法修改數據,提交數據分爲commit 和 apply方法。
    commit():同步回寫內存,然後等待異步磁盤任務結束後返回
    apply(): 同步回寫內存,然後通過Handler 異步回寫磁盤,QueuedWork中進行統一調度任務
    在這裏插入圖片描述
    在這裏插入圖片描述
    在這裏插入圖片描述
    在這裏插入圖片描述
    在這裏插入圖片描述
    在這裏插入圖片描述

總結

通過以上源碼分析,大體可以總結爲以下幾點:
1.SharedPreferences 線程安全,由Synchronized進行保證
2.SharedPreferences 進程不安全,Google也不推薦使用SharedPreferences進程間數據共享
3.SharedPreferences 數據是以鍵值對形式保存數據,適合簡單的不頻繁修改的數據,且數據不宜過大
4.SharedPreferences 不宜濫用,每個文件不宜過大,頻繁改動的和不經常變化的分成不同的文件進行保存

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