免费爱碰视频在线观看,九九精品国产屋,欧美亚洲尤物久久精品,1024在线观看视频亚洲

      Android Jetpack之DataStore指南

      介紹:

      官方尚未出手之前,存儲鍵值對等小型數據集可能普遍采用兩種方式,SharedPreferences或是MMKV(如果您需要支持大型或復雜數據集、部分更新或參照完整性,請考慮使用 Room,而不是 DataStore。DataStore 非常適合簡單的小型數據集,不支持部分更新或參照完整性。) MMKV這次暫時不提及,因為DatStore本身對比的也就是SharedPreferences,而且官方也是明確的建議我們遷移到DataStore。 DataStore包含了兩種實現方式:

      • Preferences DataStore僅使用鍵存儲和訪問值數據。此實現不需要預定義的架構,并且不提供類型安全性。
      • Proto DataStore將數據存儲為自定義數據類型的實例。此實現要求您使用協議緩沖區(qū)(protobuf – PB協議)定義架構,但它提供類型安全性。

      與SharedPreferences的對比:

      首先我們來看官方的一張對比

      功能

      SharedPreferences

      PreferencesDataStore

      ProtoDataStore

      異步 API

      (僅用于通過監(jiān)聽器讀取已更改的值)

      (通過 Flow 以及 RxJava 2 和 3 Flowable)

      (通過 Flow 以及 RxJava 2 和 3 Flowable)

      同步 API

      (但無法在界面線程上安全調用)

      可在界面線程上安全調用

      1

      (這項工作已在后臺移至 Dispatchers.IO)

      (這項工作已在后臺移至 Dispatchers.IO)

      可以提示錯誤

      不受運行時異常影響

      2

      包含一個具有強一致性保證的事務性 API

      處理數據遷移

      類型安全

      使用協議緩沖區(qū)

      我們先暫時只看PreferencesDataStore和SharedPreferences 首先同步API和異步API這兩點區(qū)別是沒有問題的。 SharedPreferences:

      • apply()來完成異步操作:會立即更改內存中的 SharedPreferences 對象,但會將更新異步寫入磁盤。而且apply()還有個問題就是,雖然他本身是異步的來完成IO操作,但是在SharedPreferencesImpl.EditorImpl.apply()中會添加到QueuedWork中,當Service或者Activity啟動或停止時,具體可見ActivityThread中handleServiceArgs,handleStopService,handlePauseActivity,handleStopActivity均會執(zhí)行QueuedWork.waitToFinish()等待數據寫入的完成,因為要保證數據不會丟失,但是我們也知道,onPause() 是不適合執(zhí)行耗時操作的,因為當你期待另一個Activity的時候,會先onPause當前Activity,這很明顯,假如你寫入了較多內容,然后立馬啟動了另一個Activity,結果在onPause()被阻塞,就很容易導致ANR。
      • commit()來實現同步操作,但應避免從主線程調用它,因為它可能會阻塞UI線程,這點沒什么好說的,而且會返回Boolean值來表示寫入是否成功。

      詳細的可以查看SharedPreferences.Editor接口提供的注釋,具體的實現在SharedPreferencesImpl.EditorImpl我這里就不貼源碼了。 回到DataStore,PreferencesDataStore本身是基于攜程Flow來實現的,所以異步API這點沒有任何問題,不過至于同步的使用方式,放到后面來說,我們先看普遍的異步使用方式。我就不一一復述了。

      使用:

      private const val USER_PREFERENCES_NAME = “user_preferences”private val Context.dataStore by preferencesDataStore( name = USER_PREFERENCES_NAME)

      首先是通過委托拿到DataStore單例.

      public fun preferencesDataStore( name: String, corruptionHandler: ReplaceFileCorruptionHandler? = null, produceMigrations: (Context) -> List = { listOf() }, scope: CoroutineScope = CoroutineScope(Dispatchers.IO + SupervisorJob())): ReadOnlyProperty { return PreferenceDataStoreSingletonDelegate(name, corruptionHandler, produceMigrations, scope)}internal class PreferenceDataStoreSingletonDelegate internal constructor( private val name: String, private val corruptionHandler: ReplaceFileCorruptionHandler?, private val produceMigrations: (Context) -> List, private val scope: CoroutineScope) : ReadOnlyProperty { private val lock = Any() @GuardedBy(“lock”) @Volatile private var INSTANCE: DataStore? = null override fun getValue(thisRef: Context, property: KProperty): DataStore { return INSTANCE ?: synchronized(lock) { if (INSTANCE == null) { val applicationContext = thisRef.applicationContext INSTANCE = PreferenceDataStoreFactory.create( corruptionHandler = corruptionHandler, migrations = produceMigrations(applicationContext), scope = scope ) { applicationContext.preferencesDataStoreFile(name) } } INSTANCE!! } }}

      本質上還是走的PreferenceDataStoreFactory.create()創(chuàng)建,是一個非常標準的雙重檢查鎖單例。 來看一下create()函數的參數吧

      • corruptionHandler: 異常處理,當反序列化錯誤時會走到這,可以用于讀取錯誤是返回默認值或捕獲異常。
      • migrations: 用于遷移SharedPreferences到PreferenceDataStore
      • scope: 協程的作用域,指定IO操作及數據轉換的執(zhí)行的協程作用域
      • produceFile: 基于提供的Context和name創(chuàng)建或讀取對應的文件,默認路徑為this.applicationContext.filesDir + datastore/fileName

      推薦做法也是通過PreferenceDataStoreFactory來創(chuàng)建DataStore實例并作為單例注入需要它的類中。

      讀?。?/h1>

      dataStore.data .catch { exception -> // 有異常拋出 if (exception is IOException) { // 使用默認空值 emit(emptyPreferences()) } else { // 其他異常則繼續(xù)拋出 throw exception } }.map { preferences -> // 數據轉化 }.collect { // 收集數據 }

      emptyPreferences()可以參考上面提到的官方教學示例,里面會詳細介紹PreferenceData的KV 可以看出dataStore返回的是一個Flow,你可以很方便的轉換成你所需要的數據。

      寫入:

      val INT_KEY = intPreferencesKey(“int_key”)dataStore.edit { preferences -> preferences[INT_KEY] = 1}// 調用public suspend fun DataStore.edit( transform: suspend (MutablePreferences) -> Unit): Preferences { return this.updateData { // It’s safe to return MutablePreferences since we freeze it in // PreferencesDataStore.updateData() it.toMutablePreferences().apply { transform(this) } }}

      直接調用edit函數,不過要注意的是edit可能會拋出異常。 同時還有兩點需要注意:

    1. 在transform執(zhí)行完之前,在transform里改變的值并不會馬上更新到DataStore,執(zhí)行完才會,所以在edit()函數成功返回之前不要認為數據已經寫入成功。
    2. 不要保存在transform中提供的MutablePreferences的引用,在transform外的對preferences操作并不會更新到DataStore,因為這很明顯破壞了原設計的原子性與事務性。
    3. 總結:

      總的來說還是很推薦使用DataStore,與協程的搭配,用起來也是非常的便利,至于PB協議的ProtoDataStore,可以參考官方的示例來實踐,差別主要是還是集中在PB文件的處理。

      作者:Lowae鏈接:https://juejin.cn/post/7109395564789235720

      鄭重聲明:本文內容及圖片均整理自互聯網,不代表本站立場,版權歸原作者所有,如有侵權請聯系管理員(admin#wlmqw.com)刪除。
      用戶投稿
      上一篇 2022年6月20日 12:58
      下一篇 2022年6月20日 12:58

      相關推薦

      • TES官宣knight斷開連接!網友:左手就是下一個369

        2022LPL冬季轉會期已經正式到來,如果說此次轉會期熱度最高的一支隊伍,無疑就是在2022全球總決賽中拿到四強成績的JDG了。因為據目前網上爆料人的消息來看,JDG很有可能會通過…

        2022年11月27日
      • 存儲過程語法(sql server存儲過程語法)

        今天小編給各位分享存儲過程語法的知識,其中也會對sql server存儲過程語法進行解釋,如果能碰巧解決你現在面臨的問題,別忘了關注本站,現在開始吧! oracle存儲過程基本語法…

        2022年11月26日
      • 男子賭球輸千萬跳樓?當地回應!

        據浙江省杭州市蕭山區(qū)人民政府新聞辦公室官方微博消息,近日,關于一則“男子賭球后跳樓”的信息在網上流傳,經官方核實, 該信息不實。11月22日20時許,蕭山警方接群眾報警,北干街道某…

        2022年11月26日
      • 《云頂之弈》s8什么時候上線國服?s8國服上線時間介紹

        云頂之弈的s8版本為怪物來襲版本,現已正式在美測服上線了。很多小伙伴可能還不清楚該版本什么時候在國服上線吧,今天小編給大家?guī)碓祈斨膕8國服上線時間介紹,快來看一下吧。 s8國服…

        2022年11月25日
      • 什么是推廣cpa一篇文章帶你看懂CPA推廣渠道

        CPA渠道 CPA指的是按照指定的行為結算,可以是搜索,可以是注冊,可以是激活,可以是搜索下載激活,可以是綁卡,實名認證,可以是付費,可以是瀏覽等等。甲乙雙方可以根據自己的情況來定…

        2022年11月25日
      • 早報:曼聯宣布C羅離隊!

        【曼聯宣布C羅離隊】 足壇重磅!曼聯官方:C羅離隊達成一致,即刻生效!! 曼聯官方發(fā)布重磅公告,C羅將離開曼聯,立即生效。 【C羅發(fā)聲】 C羅談離隊:我愛曼聯,我愛紅魔球迷,這永遠…

        2022年11月25日
      • 抖音直播帶貨有哪些方法技巧(抖音直播帶貨有哪些痛點)

        如今抖音這個短視頻的變現能力越來越突顯了,尤其是在平臺上開通直播,更具有超強的帶貨屬性,已經有越來越多的普通人加入到其中了。不過直播帶貨雖然很火,但是也不是每個人都能做好的,那么在…

        2022年11月24日
      • iPhoneSE4價格或在3000以內 蘋果se4最新消息

        據相關爆料,明年即將在春季發(fā)布的iPhoneSE4系列,售價可能會在3000元以內,可能會使用iPhone SE4與紅米K系列直接競爭,打算正式進入2000元價位市場。可以看出,如…

        2022年11月24日
      • 淘寶直播平臺抽成多少(淘寶直播平臺抽成比例)

        隨著時代的發(fā)展,現在直播帶貨已經成為主要帶貨方式,其中淘寶是主流帶貨平臺,不少人在上面直播帶貨賺錢,一些小伙伴也想加入,那么淘寶直播平臺抽成多少?下面小編為大家?guī)硖詫氈辈テ脚_抽成…

        2022年11月24日
      • 淘寶直播開通后帶貨鏈接怎么做(淘寶直播需要開通淘寶店鋪嗎)

        直播帶貨無論是對于商家來說還是主播收益都是非??捎^的,所以不少平臺都有直播帶貨功能,一些小伙伴也想加入淘寶直播,那么淘寶直播開通后帶貨鏈接怎么做?下面小編為大家?guī)硖詫氈辈ラ_通后帶…

        2022年11月24日

      聯系我們

      聯系郵箱:admin#wlmqw.com
      工作時間:周一至周五,10:30-18:30,節(jié)假日休息