Android數據緩存框架 - 內存數據載體從LiveData到StateFlow

引言:所有成功者的背后,都有一份艱苦的歷程,不要只看到了人前的風光,而低估了他們背后所付出的努力。

隨著flow到流行度越來越高,有開發者呼吁我使用flow,于是我就如你們所愿,新增了StateFlow作為新的數據載體。當然你仍然可以使用舊版本的LiveData,代碼寫法略微不同罷了。如果對我的dcache框架設計不是很理解的小伙伴,可以看我的專欄其他文章。

為什么推薦使用StateFlow

如果你非要問我為什么要使用StateFlow?我可以告訴你,因為可以裝逼,哈哈,開個玩笑。新技術的流行必然有一部分炒作的部分,但也肯定是有其改進的地方的。要講StateFlow,就不得不從flow開始說起。flow是屬于kotlin語言范疇的,你可以把它當成kotlin協程的一個API。沒錯,kotlin語言的野心就是要做跨平臺的語言,答案就在這里,LiveData是android的API,而SharedFlow與StateFlow直接就是Kotlin編程語言級別的,代碼復用性更好。

LiveData和StateFlow使用對比

以列表數據模式的Repository為例。從2.1.5開始@Repository注解拆分成了@Repository注解和@ListRepository,所以2.1.4版本你應該使用@Repository注解,而如果說,你使用的是2.1.5及以上版本的dcache庫,要使用@ListRepository注解。由于StateFlow在2.2.0版本才開始支持,所以自然要使用@ListRepository注解。
先看StateFlow的寫法。

override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)// 此處省略代碼若干行lifecycleScope.launchWhenCreated {repository.getListFlowData().collect {adapter.setTemperatures(it)}}
}

不要忘了使用協程作用域。
然后我們調用fetchListData()。

repository.fetchListData(listener = object : OnLoadStateListener {override fun onLoad(state: Int) {Log.d("WeatherActivity", "數據是否加載成功:${state==0}")}
}, description = null)

加載狀態監聽接口和描述信息可以傳null。這個抓取數據方法一經調用,collect代碼塊就會刷新數據。由于fetchListData()天然就返回的StateFlow,所以你并不一定要分為兩步觀察數據。而如果你要分為兩步,則調用getListFlowData()或getFlowData()。
再看原來LiveData的寫法,這次我們不用list模式的Repository,如果要使用,直接配置@Repository注解。

minutelyRepository.latlng = "116.407526,39.90403"
minutelyRepository.fetchData("按分鐘統計天氣").observe(this, Observer {it?.apply {tvCacheMinutely.text = "minutely:${toString()}\n"}
})

很明顯,fetchData()返回LiveData,直接調用observe()進行數據的觀察。簡單總結下,API的設計在調用層面具有相似性,所以,無論你使用的是LiveData為數據載體的Repository還是StateFlow的,都是調用fetchData()或fetchListData()更新緩存數據,框架內部自動幫你緩存到數據庫,同時常駐在內存并遞送給UI層刷新界面。所以你可以專心開發你的業務邏輯,這是不是很棒?

package com.example.dcache.repositoryimport android.content.Context
import com.example.dcache.biz.weather.WeatherService
import com.example.dcache.model.WeatherModel
import dora.cache.data.fetcher.OnLoadStateListener
import dora.cache.repository.DoraDatabaseCacheRepository
import dora.cache.repository.Repository
import dora.http.DoraCallback
import dora.http.retrofit.RetrofitManager@Repository
class WeatherRepository(context: Context) : DoraDatabaseCacheRepository<WeatherModel>(context) {var latlng: String = ""override fun onLoadFromNetwork(callback: DoraCallback<WeatherModel>,listener: OnLoadStateListener?) {RetrofitManager.getService(WeatherService::class.java).getWeather(latlng).enqueue(callback)}
}

最后簡單復習一下Repository的寫法。詳細Demo代碼https://github.com/dora4/DoraCacheSample 。

框架設計的變化

這是StateFlow的。

/*** 用于網絡數據抓取。*/
interface IFlowDataFetcher<M> {/*** 清空flow data的數據。*/fun clearData()/*** 抓取數據的回調。*/fun callback(): DoraCallback<M>/*** 開始抓取數據。*/fun fetchData(description: String?, listener: OnLoadStateListener? = OnLoadStateListenerImpl()): StateFlow<M?>/*** 獲取flow data。*/fun getFlowData(): StateFlow<M?>
}

這是LiveData的。

package dora.cache.data.fetcherimport androidx.lifecycle.LiveData
import dora.http.DoraCallback/*** 用于網絡數據抓取。*/
interface IDataFetcher<M> {/*** 清空livedata的數據。*/fun clearData()/*** 抓取數據的回調。*/fun callback(): DoraCallback<M>/*** 開始抓取數據。*/fun fetchData(description: String?, listener: OnLoadStateListener? = OnLoadStateListenerImpl()): LiveData<M?>/*** 獲取livedata。*/fun getLiveData(): LiveData<M?>
}

是不是沒啥變化?對的,這就是架構設計的魅力所在。前期架構設計比較到位,所以只需要遵循開閉原則。對擴展開放,對修改關閉。
截屏2024-01-07 17.31.22.png
原先繼承BaseRepository的,現在繼承BaseFlowRepository的。名字有帶Flow單詞的,就是StateFlow的。

開源框架支持

筆者寫框架和文檔不容易,希望你的支持。你的支持是我改進優化最大的動力!

數據緩存dcache框架 https://github.com/dora4/dcache-android

dora框架的開發插件 https://github.com/dora4/dora-studio-plugin

dora框架 https://github.com/dora4/dora

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/17411.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/17411.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/17411.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

智能時代下,人機交互和虛擬現實的機遇和挑戰

智能時代下,人機交互和虛擬現實的機遇和挑戰

多態(C++)

多態(C) 本文如果有錯誤或者不足的地方&#xff0c;希望各位大佬多多指點。 【本文目錄】 1.多態的概念2.多態的定義及實現3.抽象類4.多態的原理5.單繼承和多繼承的虛函數表 1.多態的概念 多態的概念就是&#xff1a;多種形態 多態就是可以有多種的形態。不同的身份去實現同一…

【Leetcode 160】環形鏈表——雙指針,細節講解

題目 給你一個鏈表的頭節點 head &#xff0c;判斷鏈表中是否有環。 如果鏈表中有某個節點&#xff0c;可以通過連續跟蹤 next 指針再次到達&#xff0c;則鏈表中存在環。 為了表示給定鏈表中的環&#xff0c;評測系統內部使用整數 pos 來表示鏈表尾連接到鏈表中的位置&#…

RTSP/Onvif安防視頻監控云平臺EasyNVR重啟后通道在線視頻無法播放,接口報錯502是什么原因?

EasyNVR安防視頻云平臺是旭帆科技TSINGSEE青犀旗下支持RTSP/Onvif協議接入的安防監控流媒體視頻云平臺。平臺具備視頻實時監控直播、云端錄像、云存儲、錄像檢索與回看、告警等視頻能力&#xff0c;能對接入的視頻流進行處理與多端分發&#xff0c;包括RTSP、RTMP、HTTP-FLV、W…

hypack如何采集多波束數據?(下)

多波束測量模塊 1&#xff09;記錄多波束和輔助傳感器的數據&#xff1b; 2&#xff09;顯示實時改正后的數據和數據質量信息。 ?編輯? 測量準備 1&#xff09;設置大地測量參數和硬件設置&#xff1b; 2&#xff09;計劃測線 計劃測線是一定間距的平行線&#xff0c;…

微軟聯手清華,AI注釋讓文本到圖像生成更符合人類偏好

獲取本文論文原文PDF&#xff0c;請在公眾號【AI論文解讀】留言&#xff1a;論文解讀 摘要 本研究展示了利用人類偏好數據集來精細調整文本到圖像生成模型的潛力&#xff0c;增強了生成圖像與文本提示之間的一致性。盡管取得了進展&#xff0c;現有的人類偏好數據集要么構建成…

掌控安全CTF-2024年5月擂臺賽-WP(部分)

MISC ez_Misc 題目給了一個加密的壓縮包和一個文本文檔&#xff0c;首先我們先來看文本的內容&#xff0c;如下&#xff1a; 很容易看出&#xff0c;0寬隱寫&#xff0c;用PuzzleSolver梭哈一下&#xff0c;發現了&#xff1a;Thi3 is n0t 2 hint 又在文本中發現一個特征&…

【2024】高校網絡安全管理運維賽

比賽時間&#xff1a;2024-05-06 Re-easyre 基本的base64換表&#xff0c;用CyberChef解密 Re-babyre 進入主函數&#xff0c;發現輸入四次 看一下就知道是大數求解 (當初寫的時候差不多 不知道為什么第四個總是算錯…) from z3 import *s Solver() # 設置一個解方程的類…

中心滲透Ⅱ

cs與msf權限傳遞以及mimikatz抓取win2012明文密碼 使用Cobalt Strike抓取win2012明文密碼&#xff0c;將會話傳遞到Metasploit Framework上 1.cs生成木馬并使目標服務器中馬 建立監聽生成木馬 2.抓取目標主機的明文密碼 通過修改注冊表來讓Wdigest Auth保存明文口令 shell …

技術就緒度

技術就緒度&#xff08;Technology Readiness Level&#xff0c;簡稱TRL&#xff09;這個術語中的每個字符可以這樣理解&#xff1a; 技術&#xff08;Technology&#xff09;&#xff1a;指的是正在研發或評估的具體的技術、工具、材料或方法。這可以是一套軟件程序、一個物理…

一分鐘揭秘面試官真實意圖,穩拿offer的面試秘訣!

想要在面試中脫穎而出&#xff0c;順利獲得心儀的offer嗎&#xff1f;那么&#xff0c;你需要了解面試官背后的潛臺詞。通過解析這些潛臺詞&#xff0c;你將能更準確地把握面試官的期望&#xff0c;并給出他們最喜歡的回答。下面&#xff0c;就讓我們一起揭開這層神秘的面紗&am…

深入pandas:數據分析

目錄 前言 第一點&#xff1a;導入模塊 第二點&#xff1a;準備數據 第三點&#xff1a;簡單的分析數據 第四點&#xff1a;【重點】數據透支 總結 前言 在數據分析與挖掘的領域&#xff0c;了解如何使用工具和方法來探索數據是至關重要的。本文將探討如何利用Python中的…

C語言常用字符串處理函數

C語言中包含了很多對字符串處理的函數,要使用這些函數&#xff0c; 首先需要導入頭文件#include <string.h> 1. strlen() -- 計算字符串長度 原型: size_t strlen(char const *string); 例: char *str "abcde"; size_t len strlen(str); // 結果為…

【DevOps】Elasticsearch在Ubuntu 20.04上的安裝與配置:詳細指南

目錄 一、ES 簡介 1、核心概念 2、工作原理 3、 優勢 二、ES 在 Ubuntu 20.04 上的安裝 1、安裝 Java 2、下載 ES 安裝包 3、創建 ES 用戶 4 、解壓安裝包 5、 配置 ES 6、 啟動 ES 7、驗證安裝 三、ES 常用命令 1、創建索引 2、 插入文檔 3、查詢文檔 四、ES…

1.6 分組延時,丟失和吞吐量

分組丟失和延時是怎樣發生的&#xff1f; 在路由器緩沖區的分組隊列 ? 分組到達鏈路的速率超過了鏈路輸出的能力 ? 分組等待排到隊頭、被傳輸 分組排隊&#xff0c;傳輸分組&#xff08;延時&#xff09; 分組到達路由器&#xff0c;沒有可用的隊列&#xff0c;則該分組被丟…

利用audacity和ffmpeg制作測試音頻文件

最近要用SIPP測試一個場景&#xff0c;需要發送雙聲道/16K采樣率/16bit量化的PCM流&#xff0c;但是下載的素材往往不能滿足參數要求。那么就自己制作。 首先下載mp3文件&#xff0c;并用audacity打開。 接下來&#xff0c;點擊菜單欄中軌道-重采樣&#xff0c;將采樣頻率設為1…

Java:String、StringBuffer和StringBuilder的區別

參考&#xff1a; https://blog.csdn.net/kingzone_2008/article/details/9220691 https://blog.csdn.net/itchuxuezhe_yang/article/details/89966303 String 常量字符串&#xff0c;每次修改都是會新創建一個字符串&#xff0c;當要頻繁修改字符串的時候不建議使用 String S…

C++實現日期類(類和對象總結與實踐)

頭文件&#xff1a; 首先&#xff0c;在頭文件Date.h中聲明日期類 先上代碼&#xff0c;然后一步一步解析每個函數 #include<iostream> #include<assert.h> using namespace std;class Date {public:void Print() const;// 獲取某年某月的天數// 這個函數會被頻…

做好隨時離開的準備:前一天還在為618加班到凌晨,第二天就被裁了

今日感悟 最近&#xff0c;一則令人唏噓的新聞在網絡上引起了廣泛關注&#xff1a;一名員工前一天還在為618大促活動加班到凌晨&#xff0c;身心疲憊&#xff0c;然而第二天卻收到了裁員通知&#xff0c;頓時陷入了失業的困境。 這則新聞不僅揭示了職場競爭的殘酷現實&#xff…

有關服務器安全的反思

文章目錄 前言MySQL數據庫的安全物理服務器總結 前言 人都說學的越多&#xff0c;不懂的東西也就越多&#xff0c;很多人都會有這個感受&#xff0c;面對信息爆炸的互聯網時代&#xff0c;有種“學不完&#xff0c;根本學不完”滄桑無力感&#xff0c;最近有關服務器安全的了解…