深入學(xué)習(xí)DataStore(一),Google為什么放棄SharedPreferences

目錄

深入學(xué)習(xí)DataStore(一),Google為什么放棄SharedPreferences
深入學(xué)習(xí)DataStore(二),使用 Preferences DataStore存儲(chǔ)數(shù)據(jù)
深入學(xué)習(xí)DataStore(三),遷移 SharedPreferences 到 DataStore
深入學(xué)習(xí)DataStore(四),如何使用Proto DataStore數(shù)據(jù)存儲(chǔ)
Jetpack DataStore是一種用來(lái)替換SharedPreferences新型數(shù)據(jù)存儲(chǔ)解決方案

Jetpack DataStore是以 Kotlin協(xié)程Flow功能為基礎(chǔ)提供了兩種方式

  • Proto DataStore 存儲(chǔ)類(lèi)的對(duì)象,通過(guò) protocol buffers 將對(duì)象序列化存儲(chǔ)在本地
  • Preferences DataStore 以鍵值對(duì)的形式存儲(chǔ)在本地和SharedPreferences類(lèi)似,基于 Flow 實(shí)現(xiàn)的撵术,不會(huì)阻塞主線(xiàn)程蛋铆,并且保證類(lèi)型安全

為什么Google要替換SharedPreferences

其實(shí)SharedPreferences作為一種輕量級(jí)的數(shù)據(jù)存儲(chǔ)方式,使用起來(lái)也非常方便,以鍵值對(duì)的形式存儲(chǔ)在本地级乍,初始化 SharedPreference 的時(shí)候优质,會(huì)將整個(gè)文件內(nèi)容加載內(nèi)存中竣贪,因此會(huì)帶來(lái)以下問(wèn)題:

  • getXXX()獲取值的形式有可能會(huì)導(dǎo)致主線(xiàn)程阻塞
  • SharedPreferences不能保證類(lèi)型安全, 加載的數(shù)據(jù)會(huì)一直留在內(nèi)存中,浪費(fèi)內(nèi)存
  • apply()方法雖然是異步的巩螃,可能會(huì)發(fā)生 ANR
  • apply() 方法無(wú)法獲取到操作成功或者失敗的結(jié)果
(1)為什么getXXX()方法會(huì)導(dǎo)致主線(xiàn)程阻塞

因?yàn)間etXXX()都是同步的演怎,在主線(xiàn)程調(diào)用 get 方法時(shí),同步方法內(nèi)調(diào)用了 wait() 方法避乏,會(huì)一直等待 getSharedPreferences() 方法開(kāi)啟的線(xiàn)程讀取完數(shù)據(jù)才能繼續(xù)往下執(zhí)行爷耀,如果數(shù)據(jù)量讀取的小,并沒(méi)有什么影響,如果讀取的文件較大會(huì)導(dǎo)致主線(xiàn)程阻塞

具體大家可以查看haredPreferences源碼

frameworks/base/core/java/android/app/SharedPreferencesImpl.java
(2)SharedPreferences不能保證類(lèi)型安全,并且一直會(huì)留在內(nèi)存中

看一個(gè)例子

    val key = "DataStore"
    val sp = getSharedPreferences("文件名", Context.MODE_PRIVATE) 
    sp.edit { putInt(key, 0) } // 使用 Int 類(lèi)型的數(shù)據(jù)覆蓋相同的 key
    sp.getString(key, ""); // 使用相同的 key 讀取 Sting 類(lèi)型的數(shù)據(jù)
    

使用 Int 類(lèi)型的數(shù)據(jù)覆蓋掉相同的 key,然后使用相同的 key 讀取 Sting 類(lèi)型的數(shù)就會(huì)造成ClassCastException異常
而通過(guò) getSharedPreferences() 方法加載的數(shù)據(jù)淑际,最后會(huì)將數(shù)據(jù)存儲(chǔ)在靜態(tài)的成員變量中畏纲。

(3)apply()方法是異步的,可能會(huì)發(fā)生ANR

異步的提交為什么會(huì)發(fā)生ANR呢,這里有一個(gè)關(guān)于這個(gè)問(wèn)題的文章分析

剖析 SharedPreference apply 引起的 ANR 問(wèn)題

DataStore帶來(lái)了哪些改變呢?

與其說(shuō)DataStore相對(duì)SharedPreference的改變,不如說(shuō)是Preferences DataStore,因?yàn)镻references DataStore主要是替換SharedPreference的,并且解決了SharedPreference所有問(wèn)題

  • DataStore 是基于 Flow 實(shí)現(xiàn)的扇住,所以保證了在主線(xiàn)程的安全性
  • 以事務(wù)方式處理更新數(shù)據(jù),事務(wù)有四大特性(原子性盗胀、一致性艘蹋、 隔離性、持久性)
  • 沒(méi)有 apply() 和 commit() 等等數(shù)據(jù)持久的方法
  • 自動(dòng)完成 SharedPreferences 遷移到 DataStore票灰,保證數(shù)據(jù)一致性女阀,不會(huì)造成數(shù)據(jù)損壞
  • 可以監(jiān)聽(tīng)到操作成功或者失敗結(jié)果

目前DataStore已經(jīng)發(fā)布alpha01版本

具體可以參看JetPack DataStore

(每天學(xué)習(xí)一點(diǎn)點(diǎn).每天進(jìn)步一點(diǎn)點(diǎn),分享不宜路過(guò)點(diǎn)個(gè)贊呀,喜歡的點(diǎn)個(gè)關(guān)注后續(xù)更新不斷)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市屑迂,隨后出現(xiàn)的幾起案子浸策,更是在濱河造成了極大的恐慌,老刑警劉巖惹盼,帶你破解...
    沈念sama閱讀 218,284評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件庸汗,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡手报,警方通過(guò)查閱死者的電腦和手機(jī)蚯舱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)掩蛤,“玉大人枉昏,你說(shuō)我怎么就攤上這事∽崮瘢” “怎么了兄裂?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,614評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)阳藻。 經(jīng)常有香客問(wèn)我晰奖,道長(zhǎng),這世上最難降的妖魔是什么稚配? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,671評(píng)論 1 293
  • 正文 為了忘掉前任畅涂,我火速辦了婚禮港华,結(jié)果婚禮上道川,老公的妹妹穿的比我還像新娘。我一直安慰自己立宜,他們只是感情好冒萄,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,699評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著橙数,像睡著了一般尊流。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上灯帮,一...
    開(kāi)封第一講書(shū)人閱讀 51,562評(píng)論 1 305
  • 那天崖技,我揣著相機(jī)與錄音逻住,去河邊找鬼。 笑死迎献,一個(gè)胖子當(dāng)著我的面吹牛瞎访,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播吁恍,決...
    沈念sama閱讀 40,309評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼扒秸,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了冀瓦?” 一聲冷哼從身側(cè)響起伴奥,我...
    開(kāi)封第一講書(shū)人閱讀 39,223評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎翼闽,沒(méi)想到半個(gè)月后拾徙,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,668評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡感局,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,859評(píng)論 3 336
  • 正文 我和宋清朗相戀三年锣吼,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蓝厌。...
    茶點(diǎn)故事閱讀 39,981評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡玄叠,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出拓提,到底是詐尸還是另有隱情读恃,我是刑警寧澤,帶...
    沈念sama閱讀 35,705評(píng)論 5 347
  • 正文 年R本政府宣布代态,位于F島的核電站寺惫,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏蹦疑。R本人自食惡果不足惜西雀,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,310評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望歉摧。 院中可真熱鬧艇肴,春花似錦、人聲如沸叁温。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,904評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)膝但。三九已至冲九,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間跟束,已是汗流浹背莺奸。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,023評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工丑孩, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人灭贷。 一個(gè)月前我還...
    沈念sama閱讀 48,146評(píng)論 3 370
  • 正文 我出身青樓嚎杨,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親氧腰。 傳聞我的和親對(duì)象是個(gè)殘疾皇子枫浙,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,933評(píng)論 2 355