- 閱讀本文大概需要4min
關(guān)鍵字
Architecture、MVP 、The Clean Code

前言
本文是本人對于Android MVP的架構(gòu)的學(xué)習(xí)過程以及思考,沒有具體的代碼例子,不過我相信你看了肯定會有收獲的。
思考
AndroidMVP的設(shè)計(jì)架構(gòu)從接觸到現(xiàn)在已經(jīng)快有兩年了,這些年一直與自己的糟糕的代碼打交道,
從不規(guī)范的MVC——把大多數(shù)業(yè)務(wù)邏輯和界面展示寫在Fragement/Activity里
到不規(guī)范的MVP——把數(shù)據(jù)與邏輯處理(M與P),以及邏輯處理與界面(P與V)代碼區(qū)分的不清晰。
關(guān)于學(xué)習(xí)MVP的教程,百度Google一搜一大把,但是很多都是互相摘抄甚至是誤導(dǎo)性錯(cuò)誤理解。以下我將從MVP的介紹,MVP資料學(xué)習(xí),MVP的思考三個(gè)方面進(jìn)行總結(jié),講的不好歡迎交流想法、拍磚。
MVP介紹
M-V-P,分別是Model(數(shù)據(jù)管理層,包括遠(yuǎn)程服務(wù)器與本地緩存以及本地?cái)?shù)據(jù)庫等),Presenter(業(yè)務(wù)處理層,View與Model交互中介的身份,負(fù)責(zé)根據(jù)View中用戶的交互來控制Model對數(shù)據(jù)的處理,然后展示到View中去),View(視圖的展示層,只有有關(guān)界面操作的方法,不直接和Model交互)
典型的架構(gòu)圖

還有最早 uncle bob在這里提出的
The Clean Architecture
兩者的差別,從圖片上可以很直觀的看到圖片2在圖片1的基礎(chǔ)上多加了Domain Layer,在這一層主要職責(zé)就是對數(shù)據(jù)進(jìn)行增刪改查的一些操作,在這里很方便寫測試用例,可以說圖2是圖1的升級版了。
MVP資料學(xué)習(xí)
最直接的資料當(dāng)然是Google官方提供的Demo了, android-architecture里面包含了基本的MVP架構(gòu),The Clean MVP 以及搭配流行框架RxJva 和Dragger2的各種版本,還有MVVM設(shè)計(jì)架構(gòu)以及與MVP一樣搭配流行框架的不同版本。最初的概念入門可以參考demo,避免走入誤區(qū)。
-
要想在項(xiàng)目中更真實(shí)的去接觸,同時(shí)手上又沒有可以入手的項(xiàng)目,學(xué)習(xí)別人的Sample是最好的方式。關(guān)于MVP架構(gòu)的學(xué)習(xí),比較流行的都會搭配一些流行框架,這樣就免不了要學(xué)習(xí)Dragger 、RxJva、RxBus(也可以用RxJava實(shí)現(xiàn))等一些流行框架的學(xué)習(xí),你可以先簡單了解一些這些開源庫,然后在學(xué)習(xí)Demo遇到問題有針對性的學(xué)習(xí),關(guān)于Sample的選擇,我有幾個(gè)親測還不錯(cuò)的。
https://github.com/esoxjem/MovieGuide 這個(gè)Demo很簡單,只有 列表展示和詳情顯示,代碼采用The Clean MVP,包含Dragger2、RxJava,對于基本了解了Dragger2 和RxJva可以先參照這個(gè)例子
Tips:例子的運(yùn)行需要去這個(gè)地址去注冊,然后申請API_KEY,最后按照README簡單配置就可以了。https://github.com/Rukey7/MvpApp這是一個(gè)比較完整的項(xiàng)目,代碼量比較大,包含新聞,圖片,視頻。包含了Dragger2、RxJava,生命周期管理rxlifecycle,Tinker熱修復(fù),視頻播放ijkPlayer,內(nèi)存泄漏檢查leakcanary等一些開源庫,該Sample適合想把開源庫結(jié)合到具體項(xiàng)目很有幫助
https://github.com/JessYanCoding/MVPArms一個(gè)你可以直接引入自己具體項(xiàng)目的MVP框架,作者對該框架進(jìn)行了比較友好的封裝,包括代碼模板的快捷鍵,Token等一些公共變量,調(diào)試信息輸出及錯(cuò)誤的捕獲,可以滿足中小型項(xiàng)目的開發(fā)。這個(gè)框架的代碼量也不少,設(shè)計(jì)上也不簡單,需要花點(diǎn)時(shí)間學(xué)習(xí)。
MVP的思考
有關(guān)思考,我總結(jié)了兩點(diǎn)
- 保證V不存在數(shù)據(jù)的全局變量
- 點(diǎn)擊事件的處理放在P里,不要放在Adapter或者Fragment的V里面