首先,這篇文章不在講解什麼是mvp模式,若是須要請自行搜索mvp模式文章瞭解.這個文章裏我只記錄mvp模式的建立和mvp各自層的界限.另外這個博客屬於我的使用mvp模式後一些經驗總結與記錄.並非最好思想的mvp.還有如下總結的mvp都是使用最簡單的mvp模式說明,不是其餘大神那種一個類放M/V/P3個內部類(我的不喜歡這種模式),也不是須要各類繼承的mvp模式.web
分別是:緩存
我的建議書寫順序是,m>v>p.至於爲何下面講解:網絡
上面只是說明了書寫順序,當是實際上mvp是6個類(3個接口類,3個實現類)的模塊,因此咱們須要瞭解MVP真正6個類應該以一個怎麼樣的思惟分別去按順序建立他們.異步
已開始寫MVP的時候,很是容易把mvp的各類界限搞混,寫着寫着就容易把P層的邏輯寫到V層上,致使P層變成一個銜接反而啥都沒作,這很正常.由於開發Android App自己在使用MVP開發上會或多或少的有些模糊,跟web端的mvp多多少少有些不一樣.下面咱們就來講一下Android開發mvp的各自界限spa
1.首先切記M層不能持有任何其餘層的實例,由於它不須要調用其餘2個層code
2.只書寫須要使用的網絡請求操做(請求網絡/暫停網絡請求/銷燬網絡請求),不寫任何的數據處理邏輯,數據只返回給P層作判斷組裝orm
3.不攔截處理網絡報錯和異常,全部網絡報錯和異常通通交給上一層P層去判斷blog
4.在Android裏,建議寫銷燬方法,固然activity被銷燬的時候按層級分別向下銷燬,最終會銷燬M層的網絡請求.不然M的網絡請求不被銷燬會出現報錯問題繼承
接口代碼例子:接口
public interface DemoModel { void pullDataApi(int id,PDataLinstener linstener);//獲取數據 這裏的PDataLinstener是負責網絡數據異步給上面的P層的接口 void pushDataApi(int id,final PDataLinstener linstener);//提交數據 void stopPullDataApi();//暫停獲取數據 void stopDataPushApi();//暫停提交數據 void destroy();//銷燬 }
1.它持有M層和V層的實例
2.它負責調用View方法導入數據
3.它負責調用M層方法請求網絡
3.負責分類數據或者格式化數據(文本/顏色值/圖片資源id),好比TextView上有一個狀態是贊成和拒絕,那麼你在P層就要分類好而後在將文本String調用View方法導入
4.緩存變量數據,個別Activity在銷燬以前都須要緩存一些數據,那麼這些數據交給P層緩存
5.有適配器adapter的activity,適配器應當交給P層建立組裝數據,在分配給ListView或者RecyclerView
6.須要實現銷燬方法,而且在這個銷燬方法裏調用M層的銷燬方法
接口代碼例子:
public interface DemoPresenter { void initView(Activity view);//初始化持有View層 Android的view就是activity,是activity傳入的 void initModel();//初始化持有Model層 void bufferData(int id);//獲得Intent傳入的須要緩存的數據 也緩存能夠是從M層返回的數據 void pullData(int id);//獲取數據 void pushData(int id);//提交數據 void stopPullData();//暫停獲取數據 void stopPushData();//暫停提交數據 void formatTimeText();//格式化時間文本 void handlerData();//處理獲取後的數據,而且負責調用View方法導入數據 void destroy();//銷燬 }
1.它只能持有P層實例
2.提供全部view的數據導入方法(包括文本/顏色值/圖片資源id等等)
3.它不能處理任何數據邏輯(只能處理是其餘activity傳入的數據,獲取後交給P層緩存)
4.不緩存任何數據
5.彈窗對話框能夠在V層建立
6.爲了避免讓點擊事件太複雜,只要是activity跳轉的點擊事件(activity跳轉還要給調給P層處理是太多餘),讓V層處理.可是若是是網絡請求的點擊事件,點擊後請調用P層的網絡請求方法.
7.能夠從持有的P層上獲取緩存數據用於傳出到其餘activity
8.在有由於有多種狀態值,致使一個view須要顯示各類不一樣的數據的時候(好比根據狀態改變文字顏色或者圖標),這個view能夠單獨寫一個方法來導入它的數據.這樣數據分類在P層,可是你始終調用這個方法導入不一樣的數據
9.只有固定數據的view,能夠統一使用一個方法所有導入.
10.須要重寫銷燬方法,將P層的銷燬方法調用
接口代碼例子:
public interface DemoView { void initView(); void initPresenter(); void getIntentData();//獲取activity傳入的數據 void initListener();//初始化監聽 void addStateViewData(String content, @IdRes int textColor);//添加狀態View數據 void addViewData(String view1Content,String view2Content,String view3Content);//添加View的數據 void goneBtn();//隱藏按鍵 void visibleBtn();//顯示按鍵 MaterialDialog pullDataWaitDialog();//獲取數據等待對話框 MaterialDialog pushDataWaitDialog();//提交數據等待對話框 void networkErrorToast();//網絡異常提示 void pushSuccessToast();//提交數據成功提示 }
Android端的整個mvp實現後,m層和v層將會十分簡潔.p層會相對複雜.當你發現你的m層和v層能一眼看明白全部代碼的時候,你的mvp模式差很少就完美了.