最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

kotlin?中的flow?sharedFlow?完整教程

 更新時間:2025年05月07日 11:24:08   作者:stevenzqzq  
SharedFlow是Kotlin協(xié)程中Flow的一種熱流(Hot?Flow),用于在多個訂閱者之間共享事件或數(shù)據(jù)流,它適合處理一次性事件(如導航、彈窗、Toast、刷新通知等),而不是持續(xù)狀態(tài),這篇文章給大家介紹kotlin中的flow?sharedFlow完整教程,感興趣的朋友一起看看吧

一 sharedFlow是什么

SharedFlow 是 Kotlin 協(xié)程中 Flow 的一種 熱流(Hot Flow),用于在多個訂閱者之間 共享事件或數(shù)據(jù)流。它適合處理 一次性事件(如導航、彈窗、Toast、刷新通知等),而不是持續(xù)狀態(tài)。

? SharedFlow 是什么?

SharedFlowFlow 的一種擴展,具備以下特點:

特性描述
熱流一旦被觸發(fā),即使沒人監(jiān)聽也會發(fā)出
多訂閱者所有活躍訂閱者都能收到事件
不保留最新值(除非設置 replay)不像 StateFlow 那樣始終有個當前值
可配置 buffer 和回放(replay)控制事件是否緩存、丟棄或排隊

它本質(zhì)上是一個“事件廣播器”。

? 常見使用場景

?? 1. 一次性 UI 事件

  • Toast 彈窗
  • SnackBar 提示
  • 導航跳轉(zhuǎn)
  • 關閉頁面
  • 對話框展示/取消

這些事件都是“一次性的”,不需要保存狀態(tài),也不該重復觸發(fā),因此適合 SharedFlow。

sealed class UiEvent {
    data class ShowToast(val message: String) : UiEvent()
    object NavigateToHome : UiEvent()
}
// ViewModel 中
private val _uiEvent = MutableSharedFlow<UiEvent>()
val uiEvent = _uiEvent.asSharedFlow()
fun loginSuccess() {
    viewModelScope.launch {
        _uiEvent.emit(UiEvent.NavigateToHome)
    }
}
// Fragment 中
lifecycleScope.launchWhenStarted {
    viewModel.uiEvent.collect { event ->
        when (event) {
            is UiEvent.ShowToast -> showToast(event.message)
            is UiEvent.NavigateToHome -> navigate()
        }
    }
}

?? 2. 流式通知

  • 通知其他模塊刷新數(shù)據(jù)
  • 數(shù)據(jù)拉取完成通知頁面更新
  • ViewModel 向 UI 發(fā)信號

?? 3. 替代 LiveData<Event> 解決重復消費問題

傳統(tǒng)用 LiveData<Event<T>>SingleLiveEvent 處理一次性事件,代碼復雜、不優(yōu)雅,而 SharedFlow 是官方推薦的替代方案。

? 在公司項目中,SharedFlow 的典型用法

使用方式
ViewModel使用 MutableSharedFlow 發(fā)送事件
UI(Activity/Fragment)使用 collect 監(jiān)聽事件,做 UI 響應
工具類/中間層也可以用于廣播通知、分發(fā)事件

示例:登錄成功后跳轉(zhuǎn) + 彈出 Toast

// ViewModel
val eventFlow = MutableSharedFlow<UiEvent>()
suspend fun login(username: String, pwd: String) {
    if (doLogin(username, pwd)) {
        eventFlow.emit(UiEvent.ShowToast("登錄成功"))
        eventFlow.emit(UiEvent.NavigateHome)
    }
}

? 與其他 Flow 類型的對比

類型是否熱流是否可變是否保留值場景
Flow? 冷流??一次性數(shù)據(jù)流
SharedFlow? 熱流??(可設置 replay)一次性事件廣播
StateFlow? 熱流??(必須初始值)狀態(tài)管理(UI 狀態(tài)、進度等)

? 總結(jié)一句話:

SharedFlow = Kotlin 中處理一次性事件的推薦工具,適合在 ViewModel → UI 層傳遞 Toast、導航、彈窗等短暫行為,比 LiveData 更現(xiàn)代、可控。

二 sharedFlow如何處理背壓的?

? 1. SharedFlow 是如何處理被壓的(Backpressure)?

SharedFlow熱流(hot stream),意味著數(shù)據(jù)會立即發(fā)出,而不會像 Flow 那樣等待訂閱者 collect。這也就意味著:

  • 如果發(fā)射得太快(比如連續(xù)多次 emit)
  • 而訂閱者還沒來得及 collect
  • 數(shù)據(jù)就可能被丟棄,或緩存起來等待

這就需要一個“緩存策略”來決定怎么處理這些“來不及處理”的數(shù)據(jù) —— 這就是 SharedFlow 的 buffer溢出策略(onBufferOverflow)

? 2. replay = 2, extraBufferCapacity = 5 的含義

val sharedFlow = MutableSharedFlow<Int>(
    replay = 2,
    extraBufferCapacity = 5
)

這兩者分別控制了兩塊緩存區(qū)域:

參數(shù)含義
replay = 2每個新訂閱者會 立刻收到前 2 條值(即“回放值”)
extraBufferCapacity = 5除了 replay 緩沖區(qū)之外,還允許臨時緩存 最多 5 條數(shù)據(jù)

?? 總緩沖區(qū)大小 = replay + extraBufferCapacity

即上面的配置,總共可以緩沖 最多 7 條數(shù)據(jù)。

這意味著在沒有 collect 的情況下,可以最多 emit 7 條數(shù)據(jù)不會失敗或丟失。

? 3. onBufferOverflow = DROP_OLDEST / DROP_LATEST / SUSPEND 是什么?

這是控制當 緩沖區(qū)已滿時,繼續(xù) emit 會怎么處理的策略。

支持的策略:

策略名解釋
DROP_OLDEST丟掉最早 emit 的一條數(shù)據(jù)(先進先出)
DROP_LATEST丟掉新發(fā)射的數(shù)據(jù)(調(diào)用的 emit)
SUSPEND(默認)掛起 emit 調(diào)用,直到 buffer 有空間(安全但可能阻塞)

示例說明:

val flow = MutableSharedFlow<Int>(
    replay = 1,
    extraBufferCapacity = 2,
    onBufferOverflow = BufferOverflow.DROP_OLDEST
)

此時總 buffer 是 3 條:

  • 如果連續(xù) emit 第 1、2、3 條 → 都能進 buffer。
  • 如果 emit 第 4 條時還沒人 collect → buffer 滿了。
  • DROP_OLDEST 策略:會把 第 1 條值移除,保留 2、3、4。

?? emit() 和 tryEmit() 的區(qū)別:

  • emit()掛起函數(shù),可能會 suspend(如果 buffer 滿且策略是 SUSPEND)。
  • tryEmit()非掛起,返回 true/false 表示是否成功發(fā)射。

? 總結(jié)一句話:

配置項意義
replay新訂閱者能收到多少“歷史值”
extraBufferCapacity在未 collect 情況下,能暫存多少新值
onBufferOverflow當緩存已滿,是否丟老的、丟新的,或掛起等候
總緩存replay + extraBufferCapacity 條數(shù)據(jù)

到此這篇關于kotlin 中的flow sharedFlow 完整教程的文章就介紹到這了,更多相關kotlin sharedFlow內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • RecyclerView Adapter輔助類詳解及示例代碼

    RecyclerView Adapter輔助類詳解及示例代碼

    本文主要介紹RecyclerView Adapter輔助類的知識,這里整理了詳細資料及簡單示例代碼,幫助大家學習這部分的內(nèi)容,有興趣的小伙伴可以參考下
    2016-09-09
  • Android實現(xiàn)跳轉(zhuǎn)第三方百度地圖導航

    Android實現(xiàn)跳轉(zhuǎn)第三方百度地圖導航

    在眾多地圖導航產(chǎn)品中,百度地圖以其精準的導航和豐富的本地生活數(shù)據(jù)受到廣泛歡迎,本項目介紹如何在 Android 中構(gòu)造 Intent 調(diào)用百度地圖導航,希望對大家有所幫助
    2025-04-04
  • Android實現(xiàn)圖片自動切換功能(實例代碼詳解)

    Android實現(xiàn)圖片自動切換功能(實例代碼詳解)

    這篇文章主要介紹了Android實現(xiàn)圖片自動切換功能,本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-02-02
  • Kotlin 協(xié)程的異常處理準則

    Kotlin 協(xié)程的異常處理準則

    協(xié)程是互相協(xié)作的程序,協(xié)程是結(jié)構(gòu)化的,正是因為協(xié)程的這兩個特點,導致它和 Java 的異常處理機制不一樣,這篇文章重點給大家介紹Kotlin 協(xié)程的異常處理準則,感興趣的朋友一起看看吧
    2024-01-01
  • Android切面編程入門講解

    Android切面編程入門講解

    這篇文章給大家分享了關于Android進階資深開發(fā)必備技能-切面編程入門的相關知識點內(nèi)容,有興趣的朋友們參考下。
    2018-08-08
  • 詳解Android的Socket通信、List加載更多、Spinner下拉列表

    詳解Android的Socket通信、List加載更多、Spinner下拉列表

    本文主要對Android的Socket通信、List加載更多、Spinner下拉列表進行案例分析。具有很好的參考價值,需要的朋友一起來看下吧
    2016-12-12
  • Flutter繪制之路徑聯(lián)合詳解

    Flutter繪制之路徑聯(lián)合詳解

    在Flutter繪制中,path路徑可謂是繪制中的核心,通過path路徑可以繪制出任意的二維圖形,所以本文就來和大家聊聊Flutter中路徑聯(lián)合的相關知識,感興趣的可以了解一下
    2023-06-06
  • ubuntu下 AndroidStudio4.1啟動報錯問題的解決

    ubuntu下 AndroidStudio4.1啟動報錯問題的解決

    這篇文章主要介紹了ubuntu下 AndroidStudio4.1啟動報錯問題的解決,本文給大家分享個人經(jīng)驗對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-10-10
  • Android RIL使用詳解

    Android RIL使用詳解

    這篇文章主要介紹了Android RIL使用詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-07-07
  • Android App中的GridView網(wǎng)格布局使用指南

    Android App中的GridView網(wǎng)格布局使用指南

    GridView布局所實現(xiàn)的就是類似于九宮格的矩陣界面效果,下面整理了Android App中的GridView網(wǎng)格布局使用指南,包括分割線的添加與自定義GridView的實現(xiàn)等技巧,需要的朋友可以參考下
    2016-06-06

最新評論

靖宇县| 太仆寺旗| 收藏| 军事| 临湘市| 河间市| 余姚市| 太仆寺旗| 东平县| 航空| 通海县| 平和县| 绍兴市| 丹东市| 沾益县| 眉山市| 搜索| 婺源县| 榆林市| 昌图县| 武定县| 安平县| 司法| 凌海市| 泗水县| 玉林市| 乌拉特中旗| 白城市| 泗洪县| 龙海市| 乡城县| 罗甸县| 来凤县| 新化县| 武宁县| 云浮市| 阿克苏市| SHOW| 高尔夫| 兴化市| 渭源县|