Flow學(xué)習(xí)小記

Flow

冷流、熱流概念

冷流:當(dāng)數(shù)據(jù)被訂閱的時(shí)候,發(fā)布者才開始執(zhí)行發(fā)射數(shù)據(jù)流的代碼。并且當(dāng)有多個(gè)訂閱者的時(shí)候,每一個(gè)訂閱者何發(fā)布者都是一對(duì)一的關(guān)系,每個(gè)訂閱者都會(huì)收到發(fā)布者完整的數(shù)據(jù)。(Flow)

熱流:無(wú)論有沒(méi)有訂閱者訂閱,事件始終都會(huì)發(fā)生。當(dāng)熱流有多個(gè)訂閱者時(shí),發(fā)布者跟訂閱者是一對(duì)多的關(guān)系,熱流可以與多個(gè)訂閱者共享信息。(StateFlow,SharedFlow)

冷流只有在消費(fèi)者收集數(shù)據(jù)時(shí)才會(huì)觸發(fā)提供者產(chǎn)生數(shù)據(jù)的代碼,從熱流收集數(shù)據(jù)不會(huì)觸發(fā)任何提供方的代碼,因?yàn)闊崃魇冀K處于活躍狀態(tài)并將數(shù)據(jù)存于內(nèi)存中。

StateFlow、SharedFlow、LiveData

LiveData:可感知生命周期,可觀察的數(shù)據(jù)持有者。

  • 觀察者的回調(diào)永遠(yuǎn)在主線程
  • 僅持有單個(gè)且最新的數(shù)據(jù)
  • 自動(dòng)取消訂閱
  • 提供【可讀可寫】和【僅可讀】?jī)蓚€(gè)版本收縮權(quán)限
  • 可配合DataBinding實(shí)現(xiàn)【雙向綁定】
  • value可為空
  • 粘性事件:會(huì)多次消費(fèi)事件,如屏幕旋轉(zhuǎn)
  • 默認(rèn)不防抖,多次調(diào)用setValue傳入的值相同,觀察者的onChange()會(huì)被多次調(diào)用

StateFlow:是一個(gè)狀態(tài)容器式可觀察數(shù)據(jù)流,可以向其收集器發(fā)出當(dāng)前狀態(tài)更新和新狀態(tài)更新。

  • 提供【可讀可寫】(MutableStateFlow)和【僅可讀】(StateFlow)兩個(gè)版本
  • 值唯一
  • 被允許多個(gè)觀察者共用(因此是共享數(shù)據(jù)流)
  • 永遠(yuǎn)只會(huì)把最新的值重現(xiàn)給訂閱者,這與活躍觀察者的數(shù)量是無(wú)關(guān)的
  • 支持dataBinding
  • 必須配置初始值,因此value空安全
  • 防抖,多次setValue會(huì)判斷是否與舊值相等

SharedFlow:SharedFlow 是 StateFlow 的可配置性極高的泛化數(shù)據(jù)流。有以下幾點(diǎn)不同:

  • MutableSharedFlow沒(méi)有起始值
  • SharedFlow可以保留歷史數(shù)據(jù)
  • MutableSharedFlow 發(fā)射值需要調(diào)用 emit()/tryEmit() 方法,沒(méi)有 setValue() 方法
  • 可以處理粘性事件:當(dāng) replay 為 0 時(shí),replayCache size 為 0,新的訂閱者獲取不到之前的數(shù)據(jù),因此不存在「粘性事件」的問(wèn)題。

SharedFlow 在其 replayCache 中保留特定數(shù)量的最新值。每個(gè)新訂閱者首先從 replayCache 中取值,然后獲取新發(fā)射的值。replayCache 的最大容量是在創(chuàng)建 SharedFlow 時(shí)通過(guò) replay 參數(shù)指定的。replayCache 可以使用 MutableSharedFlow.resetReplayCache 方法重置。


總結(jié):狀態(tài)(State)使用StateFlow,事件(Event)使用SharedFlow。LiveData主要職責(zé)是更新UI,F(xiàn)low分為三個(gè)角色(生產(chǎn)者、消費(fèi)者、中介)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容