P層與M層和V層進行交互,P層持有Model層實例,同時包含一個CallBack回調(diào)。Model層獲取數(shù)據(jù),然后P層因為持有Model層和View層,也就可以通過CallBack回調(diào)數(shù)據(jù)結(jié)果給View層更新UI。以實現(xiàn)View層和Model層的分離。
View層:要實現(xiàn)回調(diào)接口CallBack,然后只管【UI更新】
Model層:只管【獲取數(shù)據(jù)】
Presenter層:需要獲取Model數(shù)據(jù)并通過CallBack讓View層知曉來【調(diào)度】
MVP與MVC最不同的一點是M與V是不直接關(guān)聯(lián)的也是就Model與View不存在直接關(guān)系,這兩者之間間隔著的是Presenter層,其負責(zé)調(diào)控 View與Model之間的間接交互
具體實現(xiàn):
1.創(chuàng)建一個View層
public interface GoodsInfoView {
void initGoodsInfo(GoodsInfo goodsInfo);
void showErr(String err);
}
2.創(chuàng)建一個Model層
public class GoodsInfoViewModel {
private static DataProvider dataProvider;
static User user;
public GoodsInfoViewModel(DataProvider dataProvider) {
this.dataProvider = dataProvider;
this.user = DataLocalUtils.getUser();
}
public static void getGoodsInfo(String id, Dialog dialog, GoodsInfoView callBack) {
dataProvider.shop.goodsInfo(user == null ? "0" : user.getUid(), id, 0)
.subscribe(new OnSuccessAndFailListener<BaseResponse<GoodsInfo>>(dialog) {
@Override
protected void onSuccess(BaseResponse<GoodsInfo> listBaseResponse) {
callBack.initGoodsInfo(listBaseResponse.getData());
}
@Override
protected void onErr(String msg) {
callBack.showErr(msg);
}
});
}
}
3.創(chuàng)建一個Presenter層
public class GoodsPresenter {
GoodsInfoView view;
public GoodsPresenter(GoodsInfoView view) {
this.view = view;
}
public void getGoodsInfo(String id, Dialog dialog){
GoodsInfoViewModel.getGoodsInfo(id, dialog, view);
}
}
4.在Fragment頁面使用
- a.讓這個Fragment實現(xiàn)接口
GoodsInfoView
,因為目前Fragment就要充當(dāng)View層的角色,那么此Fragment就必然實現(xiàn)兩個方法:
@Override
public void initGoodsInfo(GoodsInfo goodsInfo) {
}
@Override
public void showErr(String err) {
}
- b.然后我們創(chuàng)建Persenter層實例,并調(diào)用方法
GoodsPresenter goodsPresenter = new GoodsPresenter(this);
goodsPresenter.getGoodsInfo(id,dialog);
這樣我們在Fragment就拿到了請求數(shù)據(jù)的GoodsInfo
,從而把網(wǎng)絡(luò)請求這一塊提到了Model層去做。隨著以后業(yè)務(wù)邏輯的復(fù)雜,我們 MVP層代碼都會增加許多,但我們的Fragment頁面只會加入一些新的接口實現(xiàn)UI刷新。從而大大減少了Fragment頁面的代碼行數(shù)。
總之:MVP就是把Fragment需要的網(wǎng)絡(luò)操作分離到了一個Model層,而Fragment就實現(xiàn)了V層接口以到達只管刷新UI的目的。
對于簡單的頁面真沒必要使用MVP,想必很多文章頁提醒了大家了。我們可以對一些非常復(fù)雜的頁面進行MVP分成,而簡單的頁面還是采用MVC。如果你的一個頁面代碼有了幾千行,看起來一團糟。這個時候你就需要考慮用MVP來分離了。
參考文獻:
從最簡單的Android MVP講起:
http://www.lxweimin.com/p/4736ebe1114b
Android MVP架構(gòu)搭建
http://www.jcodecraeer.com/a/anzhuokaifa/2017/1020/8625.html
Google官方實例
https://github.com/googlesamples/android-architecture
Android官方MVP架構(gòu)解讀
https://blog.csdn.net/ljd2038/article/details/51477475
Android項目框架之MVP+Dagger.Android+LiveData
http://www.lxweimin.com/p/b4885e1ac063
android:MVP架構(gòu)模式的優(yōu)雅封裝
http://www.lxweimin.com/p/4e5c1fd007bf