Android架構——MVP

caffeine-coffee-cup-6347.jpg
Android架構藍圖
ofollow,noindex">Android Architecture Blueprints 是Google的一個開源專案,專案使用不同的架構概念和工具實現相同的應用程式,作為示例用作開發者學習如何構建程式碼;同時Google也不建議我們將這些示例作為規範示例,我們應該根據這些概念構建自己專案最適合的架構;學習專案的時候寫一下自己的體會
MVP架構
使用架構
為什麼使用架構呢?總的來說就是之前的程式碼寫的太亂了;基本上所有的東西都在 Activity 或者 Fragement 中進行,導致一個Activity裡面有太多的東西需要處理;這種寫法其實都談不上MVC架構,因為資料的獲取、儲存也是在Activity裡面寫了;這個時候Activity的程式碼就顯得特別的龐大;一旦需求變更或出現bug,那簡直就是噩夢一場
對MVP的理解
Android MVP 十分鐘入門: https://juejin.im/post/58870cc2128fe1006c46e39c
之前看東西都喜歡簡單略過這個東西的概念然後去看具體的實現;這個其實是有問題的,比如之前看MVP架構也是一樣,直接看別人是怎麼實現的,額,首先新建三個資料夾,一個放Model,一個放View,一個放Presenter,然後照著樣子寫寫,的確像那麼回事,但是再看另一個MVP專案就感覺好像和自己寫的不一樣了;其實就是沒有好好理解MVP的概念、思想,MVP並沒有一個固定的寫法,只是一種概念,每個人、每個專案有不同的寫法;只有先了解它的概念、思想,在使用中有疑惑的時候,按照這種思想來繼續構建專案;
MVP其實就是將專案分為了三層
- Model層:負責操縱資料,存取,增刪改查
- View層:負責介面展示和互動
- Presenter:連線View層與Model層的橋樑並對業務邏輯進行處理;Model 去獲取資料,本地或者網路,解析回來,通過View 介面提供給介面顯示
對於P層網上更多是沒有寫 對業務邏輯進行處理 這點,比如說Google MVP的demo裡,獲取資料的時候有在P層對資料進行過濾的處理;這個操作其實在M層也可以做,那按照MVP架構就在P層進行處理;
使用栗子
Google的MVP專案是一個記事本的栗子,我自己也新建了一個專案簡單的相簿的功能;功能就是可以從本地選取圖片放到這個相簿中瀏覽,放進來的圖片資料用本地資料庫進行儲存(主要是儲存路徑);具體操作有展示圖片,新增圖片、刪除圖片;

螢幕快照 2018-11-16 下午2.54.30.png-27.3kB
BaseView和 BasePresenter 只是兩個簡單的介面
public interface BaseView { } public interface BasePresenter { }
抽象介面
先看View層,View是作為顯示資料和互動的,APP只有三個功能,那麼View要做的就是:
- 展示圖片
- 刪除圖片後會更新介面
- 新增本地圖片後更新介面
再看P層,P層是控制Model獲取資料交給View顯示的,APP只有三個功能,那麼P層要做的就是:
- 控制Model獲取資料庫的所有圖片,交給View
- 刪除圖片,通知View更新
- 儲存新增的圖片,通知View更新
然後面對介面程式設計的思想,我們把抽象出來介面,這樣子程式更清晰,因為都是同一個功能,所以抽象到一個類裡面,減少類的建立;
public interface PicturesContract { interface View extends BaseView { //顯示圖片、重新整理列表 void showPic(List<Picture> pictureList); //刪除本地圖片成功 void deletePic(int position); //新增本地圖片 void addPic(Picture picture); } interface Presenter extends BasePresenter { //獲取本地圖片 void getLocalPic(); //刪除本地圖片 void deletePic(Picture picture); //新增本地圖片 void addPic(); } }
再看Model層,新增一個 Picture
類來儲存圖片資料;一般情況資料可能從記憶體、本地或者網路獲取,這裡只考慮本地;對於Model來說,就是資料庫的增刪;所以提取出介面,新建 PictureLocalDataSource
類來實現介面,實現對資料庫的操作,這裡和Google的demo裡面一樣,使用的是Google的Room框架,
Android Room使用: https://www.jianshu.com/p/7354d5048597
/** * 對圖片進行操作 */ public interface PictureDataSource { interface GetPicCallback { void onPicGet(Picture picture); } interface GetPicsCallback { void onPicGet(List<Picture> pictureList); } //獲取所有圖片 void getPics(GetPicsCallback getPicsCallback); //獲取一張圖片 void getPic(Long picId, GetPicCallback getPicCallback); //刪除一張圖片 void deletePic(Long picId); //儲存圖片 void savePic(Picture picture); }
具體實現
在Activity裡面實現 PicturesContract.View 介面,並且初始化控制元件,做一下互動就ok了;裡面還需要初始化一個 PicturesContract.Presenter 物件, Presenter 類裡面需要一個 PictureLocalDataSource 物件取操作資料和 PicturesContract.View 物件更新介面;當用戶相應操作的時候,Presenter進行資料的操作,成功後呼叫 View 更新介面。關於物件的初始化,Google官方的demo是新建一個Activity,Activity裡面有一個Fragement作為View層,在Activity裡面進行一些初始化操作。
總結
具體就是這麼來實現,M層操作資料,V層管理介面和互動,P層負責將二者連線起來;先將每層要負責的功能抽象出來,在每層裡面實現去。介面和邏輯業務通過介面關聯,將業務實現細節隱藏,如此一來,當我們將互動之間的介面定義好之後,內部的實現細節修改,保證模組獨立性。
一些疑問
其中也有一些疑問,M層拿到圖片資料 List 以後,直接在V層給Adapter自己更新;Google的demo也是這麼做的,就是說在Activity裡面沒有進行資料的儲存,那麼如果要進行單個item的更新或者刪除操作,也需要在Adapter裡面寫方法;結合MVP的思想,資料在展示、互動的時候改變了,這個資料已經是儲存在了View中了;如果這些資料要儲存起來,就在Persenter裡面呼叫Model來操作;有疑惑或者不確定做的是否正確的時候就想想MVP思想。
//展示,重新整理圖片 @Override public void showPic(List<Picture> pictureList) { mPictureAdapter.replaceData(pictureList); }