說到MVP,Android 開發者肯定會參考Google 的基礎實現:android-architecture;大體的框架如下:
當然大家也應該關注正在成熟的:android-architecture-components,還是對開發有較大的變更。
其實這么久來Android 開發中就沒有什么很官方的框架,我覺得大家可以根據自己App 的業務情況和團隊情況,參考android-architecture(暫時并沒有加入android-architecture-components)然后再封裝定制屬于自己的框架;雖然業務可能千變萬化,但是基本的一個App 的框架可以由mvp+db+http+Base 抽象+rxjava(處理異步等真的方便)實現自己的代碼結構、整體架構、可測試性、可維護性的項目。
本文主要是記錄自己參考todo?mvp?rxjava 結合Rxjava2 抽象BaseAct,BasePresenter,BaseView 等實現的簡單項目框架的過程。(寫作記錄讓人再次思考反省)
項目框架簡介(Demo:Android-MVP-Rxjava2)
- mvp 使用mvp 相對傳統的mvc(并不想講mvvm)帶來的蜜糖不是甜的一點點,特別是復雜的項目。
- rxjava2 改良后的rxjava2 更符合 io32783 Stream 的操作,處理異步的鏈式操作看起來就會很流暢,把操作數據庫和密集度計算的操作調度到對應的線程然后結果呈現切回主線程會讓程序流暢很多。
google 的todo-mvp 使用的是rxjava1,我不想回去 - 封裝抽象Base 這幾乎就是大學課本一直在學的東西,加上一些泛型的知識
- 可測性 暫時還沒有,經常開發的時候API 沒有準備好的情況不要太多,你還在依賴測試小妹的人工黑測?
- dagger.android 有了這個使用dagger 的時候方便快捷簡單多了,依賴注入使用變得很簡單,代碼量也很少
代碼的自動生成
大家也發現了,使用MVP 抽象封裝后雖然有那么多的好處,但是代碼的量增加了不少,而且習慣MVC后入門有點難,剛開始寫起來有點吃力;我們也從來不干重復性的勞動,使用插件進行代碼自動生成吧。
根據自己封裝的MVP模式,比如你要做等錄,輸入Login,會自動生成login文件夾和LoginActivity,LoginPresenter,LoginModel等,并且這些類的范型,繼承關系接口實現都按照規則自動生成了代碼。
最后github demo 地址,僅供交流
這個項目簡單的演示了MVP得封裝使用,主要是抽象出基類,結合rxjava2。
包含基類的presenter,model,view ,甚至某個功能你覺得一點沒有必要mvp 你可以直接繼承BaseAcvtivity,否則繼承BaseMVPActivity.
登陸功能比較簡單,model 層的數據都是來源于網絡;
在文件夾mvp_more 演示的功能下稍微復雜一點,model 層有local(db)+remote(http).其中讀取db 流程用rxjava2 包裝了一下,不是在主線程完成的,不然如果查詢數據庫比較耗時UI會明顯卡一下,在讀取數據的代碼打一個斷點你會發現調試到斷點處不進行下一步UI依然可以隨意操作,如果是主線程肯定不行。
為什么一定要引入Rxjava(2)
當業務邏輯復雜繁瑣的時候依然能保持代碼的簡潔性
http 的請求和處理使用Retrofit 線程調度等和R x j a v a 有天然的易結合
某些需要異步處理的業務
后臺計算不能影響UI 操作的流暢,比如上班打卡中計算能否打卡可能很復雜,需要間隔計算但是不能影響查看打卡列表,異步操作就非常方便Rxjava2 的過濾,變換,組合等操作符集
比如像JD 等購物網站對結果根據價格顏色等進行篩選可以非常的方便操作