SharedPreferences隨筆

SharedPreferences是一種輕型的Android數(shù)據(jù)存儲方式嘁锯,它的本質是基于XML文件存儲key-value鍵值對數(shù)據(jù)凰盔,通常用來存儲一些簡單的配置信息袋坑。它的存儲位置是在/data/data/<包名>/shared_prefs目錄下胜榔。SharedPreferences對象本身只能獲取數(shù)據(jù)而不支持存儲和修改桩盲,存儲修改是通過Editor對象實現(xiàn)寂纪。比較經(jīng)典的使用方式例如用戶輸入框對過往登錄賬戶的存儲。實現(xiàn)SharedPreferences存儲的步驟如下:

1赌结、根據(jù)Context獲取SharedPreferences對象
2捞蛋、利用edit()方法獲取Editor對象。
3柬姚、通過Editor對象存儲key-value鍵值對數(shù)據(jù)拟杉。
4、通過commit()或apply()方法提交數(shù)據(jù)量承。

那么問題來了搬设,commit和apply到底有什么區(qū)別呢,或者說我們如何選擇撕捍?
總結一下:
commit() 是直接同步地提交到硬件磁盤拿穴,因此,多個并發(fā)的采用 commit() 做提交的時候忧风,它們會等待正在處理的 commit() 保存到磁盤后再進行操作默色,從而降低了效率。而 apply() 只是原子的提交到內容狮腿,后面再調用 apply() 的函數(shù)進行異步操作腿宰。
翻源碼可以發(fā)現(xiàn) apply() 返回值為 void,而 commit() 返回一個 boolean 值代表是否提交成功缘厢。
apply() 方法不會有任何失敗的提示吃度。

聽上去apply是一個非常不錯的選擇,而且當我們在用commit()方法直接提交的時候贴硫,AS會顯示如下警告
commit警告.png

但使用apply()就真的完美無缺嗎椿每。非也
上面說到,commit是直接同步地提交到硬件磁盤夜畴,apply只是原子的提交到內容拖刃,后面再調用 apply() 的函數(shù)進行異步操作。這里的后面贪绘,其實是在Activity的onPause的時候去執(zhí)行,這個時候會有一個問題央碟。我們知道税灌,Activity跳轉的時候均函,比如ActivityA跳轉到ActivityB,那么兩個Activity的生命周期是:A(onPause)-B(onCreat)-B(onStart)-B(onResume)-A(onStop)菱涤。如果我們在ActivityA的onPause中做了耗時操作苞也,將會導致Activity跳轉卡頓嚴重,甚至ANR粘秆。
也許有童鞋會說如迟,sp的加載不是在子線程么,怎么會卡住主線程攻走?子線程IO就一定不會阻塞主線程嗎殷勘?
sp為了避免同時讀寫,在操作的時候掛了一把鎖

private void awaitLoadedLocked() {
    while (!mLoaded) {
        try {
            wait();
        } catch (InterruptedException unused) {
        }
    }
}

這意味著昔搂,apply雖然開了子線程處理玲销,但是activity退出時會等待寫入完成 也可能造成anr。
所以摘符,我們在使用SP的時候贤斜,一定要仔細斟酌。不要濫用sp逛裤,非輕量級數(shù)據(jù)瘩绒,盡量避免使用sp來存儲。
而且在儲存多對數(shù)據(jù)時带族,不要多次commit锁荔。對實時性要求不高的數(shù)據(jù),盡量合并commit炉菲。避免如下錯誤寫法:

SharedPreferences sp = getSharedPreferences("test", MODE_PRIVATE);
sp.edit().putString("test1", "sss").apply();
sp.edit().putString("test2", "sss").apply();
sp.edit().putString("test3", "sss").apply();
sp.edit().putString("test4", "sss").apply();
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末堕战,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子拍霜,更是在濱河造成了極大的恐慌嘱丢,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件祠饺,死亡現(xiàn)場離奇詭異越驻,居然都是意外死亡,警方通過查閱死者的電腦和手機道偷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進店門缀旁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人勺鸦,你說我怎么就攤上這事并巍。” “怎么了换途?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵懊渡,是天一觀的道長刽射。 經(jīng)常有香客問我,道長剃执,這世上最難降的妖魔是什么誓禁? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮肾档,結果婚禮上摹恰,老公的妹妹穿的比我還像新娘。我一直安慰自己怒见,他們只是感情好俗慈,可當我...
    茶點故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著速种,像睡著了一般姜盈。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上配阵,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天馏颂,我揣著相機與錄音,去河邊找鬼棋傍。 笑死救拉,一個胖子當著我的面吹牛,可吹牛的內容都是我干的瘫拣。 我是一名探鬼主播亿絮,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼麸拄!你這毒婦竟也來了派昧?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤拢切,失蹤者是張志新(化名)和其女友劉穎蒂萎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體淮椰,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡五慈,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了主穗。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片泻拦。...
    茶點故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖忽媒,靈堂內的尸體忽然破棺而出争拐,到底是詐尸還是另有隱情,我是刑警寧澤晦雨,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布陆错,位于F島的核電站灯抛,受9級特大地震影響金赦,放射性物質發(fā)生泄漏音瓷。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一夹抗、第九天 我趴在偏房一處隱蔽的房頂上張望绳慎。 院中可真熱鬧,春花似錦漠烧、人聲如沸杏愤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽珊楼。三九已至,卻和暖如春度液,著一層夾襖步出監(jiān)牢的瞬間厕宗,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工堕担, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留已慢,地道東北人。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓霹购,卻偏偏與公主長得像佑惠,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子齐疙,可洞房花燭夜當晚...
    茶點故事閱讀 42,901評論 2 345

推薦閱讀更多精彩內容