Android SharedPreferences 數(shù)據(jù)丟失問(wèn)題

SharedPreferences 進(jìn)行的存儲(chǔ)會(huì)導(dǎo)致數(shù)據(jù)丟失?

最近由于需求迭代, K-V 的存儲(chǔ)方式加入了加解密流程, 然后上線(xiàn)后,發(fā)現(xiàn)依賴(lài)于SharedPreferences 進(jìn)行緩存的頁(yè)面,發(fā)生了一些不可思議的報(bào)錯(cuò),仿佛SharedPreferences 沒(méi)有put數(shù)據(jù)到xml中一樣.一開(kāi)始不太相信,后面分析了下,確實(shí)是這樣.

SharedPreferences 的commit 和apply?

commit 是同步提交, apply是異步處理. 為啥有這兩種區(qū)分呢,那是因?yàn)镾haredPreferences 如果用commit 來(lái)存儲(chǔ)數(shù)據(jù),數(shù)據(jù)量針對(duì)大數(shù)據(jù)那種,很容易造成ANR,因?yàn)橐獢?shù)據(jù)落地才能夠進(jìn)行后續(xù)相應(yīng)的操作的話(huà).你可以想象一下. 而用了apply 這種異步的話(huà), apply的原理是開(kāi)多一份xml 來(lái)進(jìn)行讀寫(xiě), 等數(shù)據(jù)真實(shí)落地后,再刪之前舊的那份xml. 那問(wèn)題來(lái)了,既然這個(gè)過(guò)程是異步的,有沒(méi)有可能會(huì)造成數(shù)據(jù)丟失,或者數(shù)據(jù)不準(zhǔn)確呢? 答案是,確實(shí)如此.SharedPreferences 文件的加載使用了異步線(xiàn)程,而且加載線(xiàn)程并沒(méi)有設(shè)置優(yōu)先級(jí)哼审,如果這個(gè)時(shí)候讀取數(shù)據(jù)就需要等待文件加載線(xiàn)程的結(jié)束署隘。這就導(dǎo)致主線(xiàn)程等待低優(yōu)先線(xiàn)程鎖的問(wèn)題府树,比如一個(gè) 100KB 的 SP 文件讀取等待時(shí)間大約需要 50 ~ 100ms皮钠,并且建議大家提前用預(yù)加載啟動(dòng)過(guò)程用到的 SP 文件冀自。而且重要的一點(diǎn),無(wú)論是commit 還是apply ,他在讀寫(xiě)的過(guò)程都是全量寫(xiě)入的.

SharedPreferences 的IO是否安全?

既然SharedPreferences 是要讀寫(xiě)xml來(lái)進(jìn)行數(shù)據(jù)存儲(chǔ)和讀取的,那么這個(gè)IO操作是否安全呢,在java里, IO操作都會(huì)帶上execption 拋出相應(yīng)的IO異常, 關(guān)于SharedPreferences也是一樣的.如圖:
image.png

所以其中的數(shù)據(jù)讀取量,根據(jù)相應(yīng)的流而議,文件越大,那么相應(yīng)的風(fēng)險(xiǎn)也就越大啦.因此SharedPreferences 也只適合那種輕量級(jí)的數(shù)據(jù)流的讀寫(xiě).

SharedPreferences 在線(xiàn)程間的表現(xiàn)如何?

首先看入?yún)?


image.png

方法是線(xiàn)程安全的, 但是跨線(xiàn)程呢? 如果你用了MODE_MULTI_PROCESS 的話(huà),那別的線(xiàn)程就可以更改你的數(shù)據(jù)啦.但是如果你不用這種方式的話(huà), 那數(shù)據(jù)就不能給到別的線(xiàn)程去讀寫(xiě),因此,這個(gè)流程,大家可以腦補(bǔ)一下.

那么如何處理呢?

1.不用用SharedPreferences 保存跳轉(zhuǎn)入口的緩存,而應(yīng)該利用Intent 去傳遞相應(yīng)數(shù)據(jù)到Activity 或者Fragment.
2.不要存儲(chǔ)大數(shù)據(jù), 包括一些加解密,因?yàn)榧用懿僮鲿?huì)導(dǎo)致string 的長(zhǎng)度變大, 如果都是加密存儲(chǔ),那么內(nèi)容可想而知.
3.可以區(qū)分用戶(hù)級(jí)別數(shù)據(jù)和應(yīng)用級(jí)別數(shù)據(jù)來(lái)進(jìn)行處理,如果用戶(hù)數(shù)據(jù)較大, 可以考慮一些開(kāi)源庫(kù)如MMKV,如果較小,需要加密處理保證安全的話(huà),針對(duì)部分字段進(jìn)行加解密即可.
4.應(yīng)用盡量不要過(guò)分依賴(lài)SharedPreferences來(lái)進(jìn)行相應(yīng)的業(yè)務(wù)邏輯處理操作.考慮一些設(shè)計(jì)模式來(lái)避免這個(gè)過(guò)程吧.

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末榴嗅,一起剝皮案震驚了整個(gè)濱河市化借,隨后出現(xiàn)的幾起案子秤涩,更是在濱河造成了極大的恐慌帜乞,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,525評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件筐眷,死亡現(xiàn)場(chǎng)離奇詭異黎烈,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)照棋,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)资溃,“玉大人,你說(shuō)我怎么就攤上這事烈炭∪芏В” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,862評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵符隙,是天一觀(guān)的道長(zhǎng)趴捅。 經(jīng)常有香客問(wèn)我,道長(zhǎng)霹疫,這世上最難降的妖魔是什么拱绑? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,728評(píng)論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮丽蝎,結(jié)果婚禮上猎拨,老公的妹妹穿的比我還像新娘。我一直安慰自己屠阻,他們只是感情好迟几,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,743評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著栏笆,像睡著了一般类腮。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蛉加,一...
    開(kāi)封第一講書(shū)人閱讀 51,590評(píng)論 1 305
  • 那天讹堤,我揣著相機(jī)與錄音,去河邊找鬼耕突。 笑死浪秘,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的丁眼。 我是一名探鬼主播筷凤,決...
    沈念sama閱讀 40,330評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼苞七!你這毒婦竟也來(lái)了藐守?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,244評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤蹂风,失蹤者是張志新(化名)和其女友劉穎卢厂,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體惠啄,經(jīng)...
    沈念sama閱讀 45,693評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡慎恒,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,885評(píng)論 3 336
  • 正文 我和宋清朗相戀三年任内,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片融柬。...
    茶點(diǎn)故事閱讀 40,001評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡死嗦,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出粒氧,到底是詐尸還是另有隱情越走,我是刑警寧澤,帶...
    沈念sama閱讀 35,723評(píng)論 5 346
  • 正文 年R本政府宣布靠欢,位于F島的核電站廊敌,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏门怪。R本人自食惡果不足惜骡澈,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,343評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望掷空。 院中可真熱鬧肋殴,春花似錦、人聲如沸坦弟。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,919評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)酿傍。三九已至烙懦,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間赤炒,已是汗流浹背氯析。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,042評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留莺褒,地道東北人掩缓。 一個(gè)月前我還...
    沈念sama閱讀 48,191評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像遵岩,于是被迫代替她去往敵國(guó)和親你辣。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,955評(píng)論 2 355