衡水建網(wǎng)站百度搜索風(fēng)云排行榜
\MVI(Model-View-Intent)是一種在 Android 開發(fā)中應(yīng)用的架構(gòu)模式,它將單向數(shù)據(jù)流思想發(fā)揮到極致,讓狀態(tài)管理變得更加清晰和可預(yù)測。
核心概念
MVI 架構(gòu)由三個主要部分組成:
- Model:代表應(yīng)用的狀態(tài)(State),是不可變的。當(dāng)有新的狀態(tài)產(chǎn)生時,會生成一個新的 Model 替換舊的。
- View:負(fù)責(zé)渲染 Model 的狀態(tài),同時將用戶的操作轉(zhuǎn)換為 Intent 發(fā)送出去。
- Intent:代表用戶的操作意圖,是單向數(shù)據(jù)流的起點(diǎn)。
?
單向數(shù)據(jù)流
MVI 的核心是單向數(shù)據(jù)流,其流程如下:
- 用戶在 View 上進(jìn)行操作(點(diǎn)擊按鈕、輸入文本等)
- View 將這些操作轉(zhuǎn)換為 Intent
- Intent 被發(fā)送到處理邏輯(通常是 ViewModel)
- 處理邏輯根據(jù) Intent 更新 Model
- 新的 Model 被推送到 View
- View 根據(jù)新的 Model 更新 UI
這個流程形成了一個閉環(huán),數(shù)據(jù)總是沿著一個方向流動,使得狀態(tài)變化可預(yù)測。
實(shí)現(xiàn)方式
配合Android 架構(gòu)組件(Architecture Components)
ViewModel?
ViewModel 可以承擔(dān)起業(yè)務(wù)邏輯的職責(zé),讓 Activity 和 Fragment 只負(fù)責(zé)處理 UI 渲染。
ViewModel 的生命周期比 Activity 和 Fragment 更長,它會在 Activity 或 Fragment 銷毀后繼續(xù)存在,直到相關(guān)的 UI 控制器徹底離屏。
ViewModel 中啟動一個協(xié)程來執(zhí)行網(wǎng)絡(luò)請求,即使 Activity 被銷毀,協(xié)程也不會立即停止,而是會在 ViewModel 銷毀時才會被取消。
ViewModel 可以在同一個 Activity 的多個 Fragment 之間共享數(shù)據(jù)
ViewModel 通常與StateFlow 結(jié)合使用,以實(shí)現(xiàn)數(shù)據(jù)的響應(yīng)式更新
協(xié)程
輕量高效,資源占用低
-
單線程運(yùn)行多協(xié)程:一個線程可同時處理數(shù)千協(xié)程,協(xié)程掛起時釋放線程資源,避免線程阻塞和上下文切換開銷128。
-
內(nèi)存消耗低:協(xié)程棧內(nèi)存僅為線程的千分之一,適合高并發(fā)場景(如網(wǎng)絡(luò)請求池)
異步代碼同步化,消滅回調(diào)地獄?
通過?suspend
?函數(shù)和協(xié)程構(gòu)建器(如?launch
/async
),用順序代碼風(fēng)格編寫異步邏輯,徹底規(guī)避嵌套回調(diào)
結(jié)構(gòu)化并發(fā),生命周期自動管理
-
協(xié)程作用域(如?
viewModelScope
)與組件生命周期綁定:當(dāng)?ViewModel
?或?Activity
?銷毀時,其關(guān)聯(lián)協(xié)程自動取消,避免內(nèi)存泄漏 -
父子協(xié)程異常傳播:子協(xié)程失敗自動取消父協(xié)程(協(xié)同作用域),或獨(dú)立失敗不影響父協(xié)程(主從作用域)
線程切換無痛化
Dispatcher??精準(zhǔn)控制協(xié)程執(zhí)行線程
健壯的異常處理機(jī)制
-
通過?
CoroutineExceptionHandler
?集中捕獲全局異常 -
async
/await
?結(jié)合?try-catch
?處理局部異常,避免崩潰
流
- StateFlow:作為狀態(tài)容器,提供自動去重、狀態(tài)緩存和 UI 自動刷新功能,適合表示應(yīng)用的當(dāng)前狀態(tài)。
- SharedFlow:作為事件流處理器,提供靈活的重播策略和背壓處理,適合表示一次性事件和需要自定義通知行為的場景。
room
項(xiàng)目復(fù)雜的情況下可以加入room 配合流實(shí)現(xiàn)動態(tài)數(shù)據(jù)監(jiān)聽