KotlinStateFlow單數據更新熱流設計與使用介紹_第1頁
KotlinStateFlow單數據更新熱流設計與使用介紹_第2頁
KotlinStateFlow單數據更新熱流設計與使用介紹_第3頁
KotlinStateFlow單數據更新熱流設計與使用介紹_第4頁
KotlinStateFlow單數據更新熱流設計與使用介紹_第5頁
全文預覽已結束

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第KotlinStateFlow單數據更新熱流設計與使用介紹目錄一.StateFlow的設計1.StateFlow接口2.MutableStateFlow接口二.StateFlow的使用1.MutableStateFlow方法2.使用示例

一.StateFlow的設計

StateFlow是一種單數據更新的熱流,通過emit方法更新StateFlow的數據,通過value屬性可以獲取當前的數據。在StateFlow中,核心接口的繼承關系如下圖所示:

1.StateFlow接口

StateFlow接口繼承自SharedFlow接口,代碼如下:

publicinterfaceStateFlowoutT:SharedFlowT{

//當前的數據

publicvalvalue:T

訂閱過程:在StateFlow中,每個FlowCollecter類型的對象都被稱為訂閱者。調用StateFlow類型對象的collect方法會觸發(fā)訂閱。正常情況下,訂閱不會自動結束,但訂閱者可以取消訂閱,當訂閱者所在的協(xié)程被取消時,訂閱過程就會取消。冷流轉換熱流:對于一個冷流,可以通過調用stateIn方法,轉換為一個單數據更新的熱流。相等判定:在StateFlow中,通過Any#equals方法來判斷前后兩個數據是否相等。當前后兩個數據相等時,數據不會被更新,訂閱者也不會處理。數據緩存:StateFlow必須要有一個初始值。當新訂閱者出現時,StateFlow會將最新的數據發(fā)射給訂閱者。StateFlow只保留最后發(fā)射的數據,除此之外不會緩存任何其他的數據。同時,StateFlow不支持resetReplayCache方法。StateFlow并發(fā):StateFlow中所有的方法都是線程安全的,并且可以在多協(xié)程并發(fā)的場景中使用且不必額外加鎖。操作符使用:對StateFlow使用flowOn操作符、conflate操作符、參數為CONFLATED或RENDEZVOUS的buffer操作符、cancellable操作符是無效的。使用場景:使用StateFlow作為數據模型,可以表示任何狀態(tài)。StateFlow與SharedFlow的區(qū)別:StateFlow是SharedFlow的一種特定方向的、高性能的、高效的實現,廣泛的用于單狀態(tài)變化的場景,所有與SharedFlow相關基本規(guī)則、約束、操作符都適用于StateFlow。當使用如下的參數創(chuàng)建SharedFlow對象,并對其使用distinctUntilChanged操作符,可以得到一個與StateFlow行為相同的SharedFlow對象:

//StateFlow

valstateFlow=MutableStateFlow(initialValue)

//與StateFlow行為相同的SharedFlow

//注意參數

valsharedFlow=MutableSharedFlow(

replay=1,

extraBufferCapacity=0,

onBufferOverflow=BufferOverflow.DROP_OLDEST)

//設置初始值

sharedFlow.tryEmit(initialValue)

//distinctUntilChanged方法,只有當前后發(fā)射的兩個數據不同時才會將數據向下游發(fā)射

valstate=sharedFlow.distinctUntilChanged()

StateFlow與ConflatedBroadcastChannel的區(qū)別:從概念上講,StateFlow與ConflatedBroadcastChannel很相似,但二者也有很大的差別,推薦使用StateFlow,StateFlow設計的目的就是要在未來替代ConflatedBroadcastChannel:

StateFlow更簡單,不需要實現一堆與Channel相關的接口。StateFlow始終持有一個數據,并且無論在任何時間都可以安全的通過value屬性獲取。StateFlow清楚地劃分了只讀的StateFlow和可讀可寫的StateFlow。StateFlow對前后數據的比較是與distinctUntilChanged操作符類似的,而ConflatedBroadcastChannel對數據進行相等比較是基于標識引用。StateFlow不能關閉,也不能表示失敗,因此如果需要,所有的錯誤與完成信號都應該具體化。

2.MutableStateFlow接口

MutableStateFlow接口繼承自MutableSharedFlow接口與StateFlow接口,并在此基礎上定義了一個新方法compareAndSet,代碼如下:

publicinterfaceMutableStateFlowT:StateFlowT,MutableSharedFlowT{

//當前數據

publicoverridevarvalue:T

//通過CAS的方式,更新value

//如果except與value相等,則將value更新為update,并返回true

//如果except與value不相等,不做任何操作,直接返回false

//如果except、value、update同時相等,不做任何操作,直接返回true

publicfuncompareAndSet(expect:T,update:T):Boolean

二.StateFlow的使用

1.MutableStateFlow方法

在協(xié)程中,可以通過調用MutableStateFlow方法創(chuàng)建一個MutableStateFlow接口指向的對象,代碼如下:

publicfunTMutableStateFlow(value:T):MutableStateFlowT{

通過MutableStateFlow方法可以創(chuàng)建一個類型為MutableStateFlow的對象,需要提供一個參數value,作為初始值。

在并發(fā)場景下調用emit方法時,會使StateFlow的數據快速更新,對于處理數據慢的訂閱者,將會跳過這些快速更新的數據,但當訂閱者需要處理數據時,獲取的一定是最新更新的數據。

2.使用示例

代碼如下:

privatesuspendfuntest(){

//創(chuàng)建一個熱流,初始值為1

valflow=MutableStateFlow(1)

//將MutableStateFlow對象轉換為StateFlow對象

//StateFlow對象不能調用emit方法,因此只能用于接收

valonlyReadFlow=flow.asStateFlow()

//接收者1

//啟動一個新的協(xié)程

GlobalScope.launch{

//觸發(fā)并處理接收的數據

onlyReadFlow.collect{

Log.d("liduozuishuai","test1:$it")

//接收者2

//啟動一個新協(xié)程

GlobalScope.launch{

//訂閱監(jiān)聽,當collect方法觸發(fā)訂閱時,會首先會調onSubscription方法

onlyReadFlow.onSubscription{

Log.d("liduozuishuai","test2:")

//發(fā)射數據:2

//向下游發(fā)射數據:2,其他接收者收不到

emit(2)

}.onEach{

//處理接收的數據

Log.d("liduozuishuai","test2:$it")

}.collect()

//發(fā)送數據:3,多次發(fā)送

GlobalScope.launch{

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論