一亦鳞、背景
- MVI在架構(gòu)分層上和MVP沒有本質(zhì)區(qū)別馍忽,但區(qū)別主要體現(xiàn)在架構(gòu)風(fēng)格和編程思想上
- MVI風(fēng)格
- 面向意圖,響應(yīng)式編程
- 狀態(tài)模式 + 流處理思想 = 單向不可變數(shù)據(jù)流
- 統(tǒng)一狀態(tài)源
- 恢復(fù)現(xiàn)場:進(jìn)程重生后蚜迅,堆棧中返回舵匾,屏幕旋轉(zhuǎn)等
- 可調(diào)試、可重現(xiàn)谁不。日志中記錄輸入、狀態(tài)徽诲、輸出就可以據(jù)此復(fù)現(xiàn)問題
- 可測試刹帕。
- 缺點(diǎn):對(duì)于初狀態(tài)需要關(guān)注
- MVP、MVVM有什么問題谎替?
- M偷溺、V、P可能各有各的狀態(tài)
二钱贯、MVI - Model-View-Intent
- MVI是一種響應(yīng)式和流式的處理思想挫掏,將意圖事件(用戶操作),通過函數(shù)轉(zhuǎn)換為特定Model(狀態(tài))秩命,將其結(jié)果反饋給用戶(渲染界面)尉共。
- 抽象下來得到intent(),model()弃锐,view() 三個(gè)方法
- intent() 即意圖袄友,接收用戶的輸入(即UI事件,如點(diǎn)擊事件)把意圖和相關(guān)參數(shù)封裝為數(shù)據(jù)結(jié)構(gòu)霹菊,傳遞給model()方法剧蚣。傳遞意圖的接口是統(tǒng)一的,而不像MVP持有Presenter,并調(diào)用Presenter的多個(gè)接口鸠按。
- model() 不同于一般的model礼搁,這里說的model相當(dāng)于狀態(tài)模型里的一種狀態(tài),model內(nèi)部的邏輯是不可變的目尖,這能保證狀態(tài)邏輯的一致性馒吴,同時(shí)降低系統(tǒng)的復(fù)雜性。
- view() 接收model傳來的state渲染UI
MVI跟MVP的區(qū)別是卑雁,前者是面向意圖編程募书,后者是面向接口編程
三、MVI的演進(jìn)版
基本類
- Intent
- Data class
- V層的意圖
- 強(qiáng)調(diào)的是交互意圖
- IntentFilter
- ObservableTransformer<Intent, Action>
- 對(duì)UI意圖進(jìn)行過濾和轉(zhuǎn)化為業(yè)務(wù)邏輯Action
- Action
- Data class
- 包含了該業(yè)務(wù)邏輯需要處理的信息的類
- 類似EventBus的Event
- 強(qiáng)調(diào)的是業(yè)務(wù)意圖
- Processor
- ObservableTransformer<Action, Result>
- 執(zhí)行實(shí)際業(yè)務(wù)
- Result
- Data class
- 包含UI通知狀態(tài) UiNotificationStatus:成功测蹲、失敗莹捡、正在等待結(jié)果
- 成功時(shí)按需攜帶結(jié)果數(shù)據(jù)
- 失敗時(shí)攜帶異常
- Reducer
- 我們把他翻譯成 狀態(tài)縮減:多個(gè)狀態(tài)(Model)縮減成一個(gè)。類似于scan方法
- 更新狀態(tài)扣甲,輸出State給View渲染UI
- State
- Data class
- 包含渲染View所需要的所有信息