為什么80%的碼農都做不了架構師?>>> ??
前言
根據網絡上的MVP套路寫了一個辣雞MVP DEMO
用到的
- android studio MVPHelper插件,方便自動生成框架代碼
- rxjava
- retrofit
什么是MVP
MVP就是英文的Model View Presenter,然而實際分包并不是只有這三個包,還有一個契約Contract接口包,根據項目情況還可以分更多包
- Contract
- Model
- View 指activity和fragment,需要實現View接口
- Presenter
Contract
定義Model、View、Presenter接口的方法,所有接口都在這里定義
public interface HomeContract {interface Model {void getDate(final BaseCallBack<TitleListBean> callBack);}interface View {//多個事件定義多個刷新頁面方法void refreshUi(List<TitleListBean.ContentsBean> list);}interface Presenter {void load();}
}
Model
網絡及本地數據請求操作,包括遠程數據和本地數據的請求處理
遠程數據用retrofit+rxjava實現,本地數據用room+rxjava,無論用什么方法最后都要通過callback返回結果
public class HomeModel implements HomeContract.Model {//獲取數據public void getDate(final PresenterBaseCallBack<TitleListBean> callBack) {ApiService apiService = RetrofitUtil.getRetorfit().create(ApiService.class);apiService.getList().subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new BaseObserver<TitleListBean>() {@Overridepublic void onNext(TitleListBean model) {Log.d(TAG, "獲取數據成功 ");callBack.onResponse(model); //成功的數據請求結果}@Overridepublic void onError(Throwable e) {e.printStackTrace(); //請求過程中發生錯誤callBack.onFailure("獲取數據失敗"); //失敗的數據請求結果}@Overridepublic void onComplete() {Log.d(TAG, "刷新頁面 ");}});}
}
Presenter
可以理解為界面的點擊、加載等事件的實現
作為view與model的橋梁,初始化的時候需要傳入view對象和new一個model對象
通過view調用presenter,presenter調用model,model返回數據給presenter,presenter再返回數據給view展示
public class HomePresenter implements HomeContract.Presenter {private HomeContract.View homeView;private HomeContract.Model homeModel;private Context mContext;public HomePresenter(HomeContract.View view) {this.homeView = view;this.homeModel = new HomeModel();}@Overridepublic void load() {/*** Presenter層邏輯處理* Presenter已經包含model與view對象* 1.通過model獲取數據,new一個callback對象作為參數* 2.callback對象根據model返回的結果執行view的refreshUi方法刷新頁面*/this.homeModel.getDate(new PresenterBaseCallBack<TitleListBean>() {@Overridepublic void onResponse(TitleListBean response) {homeView.refreshUi(response.getContents());}@Overridepublic void onFailure(String error) {}});}
}
CallBack
這個接口屬于Presenter層,也是model與view的橋梁,把model處理的結果告訴presenter,presenter根據處理結果告訴view刷新頁面
public interface PresenterBaseCallBack<T> {void onResponse(T response);void onFailure(String error);
}
VIEW
創建presenter對象,view的所有事件就是對應presenter的方法
public class HomeFragment extends BaseFragment implements HomeContract.View {private HomeContract.Presenter presenter;@Overrideprotected void initView(Bundle savedInstanceState) {presenter = new HomePresenter(this,getContext()); //初始化Presenter,包含view和modelpresenter.load(); //Presenter層邏輯處理}@Overridepublic void refreshUi(List<TitleListBean.ContentsBean> list) { //數據獲取成功后的頁面刷新//list 就是返回的數據,執行頁面刷新}
}
一個辣雞Demo
戳這里