MVP模式好不好,有人说好。 因为大家都说好。 有人说不好。 代码太多了。 其实还可以。 不好是因为姿势不好。
MVP全名: Model-View-Presenter; MVP是从经典机型MVC进化而来的,基本想法有共同点。 Controller/Presenter负责逻辑处理,模型提供数据,View负责显示。
先看图了解一下吧
mvp的主要目的是便于代码解耦和单元测试
先看看基类,再看看具体实现。
首先,我们来看看Fragment的提取
package com.qf fxl.qf fxl 2019 01 02.base; 导入安卓. OS.bundle; import Android.view.layoutinflater; 导入安卓. view.view; 导入Android.view.view group; importandroidx.annotation.nonnull; importandroidx.annotation.nullable; importandroidx.fragment.app.fragment; import com.qf fxl.qf fxl 2019 01 02.base.MVP.base presenter; import com.qf fxl.qf fxl 2019 01 02.base.MVP.ibase view; /** * @auther:清风扶细柳* @Date: 2019/1/2 * @Time:下午07:01 *提取的frag Meng */publicabstractclasssbasefragmentent @Nullable @Override /* *布局*/publicviewoncreateview (@ nonnullayoutinflaterinflater,@Nullable ViewGroup container @ nullablebundlesavedinstancestate (view view=view.inflate ) getactivity )、bindlayoutId )、null ); presenter=initPresenter (; presenter.attachview(this; 导入视图(视图); 返回视图; (//子类中包含方法protectedabstractpinitpresenter ); 保护性数据库服务视角(视图视图; 保护性abstract int layout id (; @ overridepublicvoidonactivitycreated (@ nullablebundlesavedinstancestate ) super.onactivitycreated ) savedinstancestate }保护性abstract void initdata (; //销毁方法@Override public void onDestroy () { super.onDestroy; //已解除绑定的view presenter.detachView (; }} 一、Presenter
package com.qf fxl.qf fxl 2019 01 02.base.MVP; import Java.lang.ref.weak reference; /** * @auther:清风扶细柳* @Date: 2018/1/2 * @Time:下午07:18 *提取的Presenter基类且继承提取的model基类和view类*/publicabstractclassbasepresentermextendsibasemodel,vextendsibaseview { protectedmmodel; //用弱引用初始化viewprivateweakreferencevweakreference; 公共base presenter () { model=initModel; //必须抽象的保护性abstract m inits模型(;//绑定//viewpublicvoidattachview(vv ) ) { weakReference=new WeakR
eference<>(v); } //解绑view 的布局 public void detachView(){ //进行判空处理 if (weakReference != null) { weakReference.clear(); weakReference = null; } } //得到弱引用对象 public V getView(){ //返回 得到的弱引用方法 return weakReference.get(); }}二、Contract
package com.qffxl.qffxl20190102.contract;import com.qffxl.qffxl.base.mvp.IBaseModel;import com.qffxl.qffxl.base.mvp.IBaseView;/** * @auther: 清风扶细柳 * @Date: 2019/1/2 * @Time:下午 07:45 * 契约接口类 用来统一管理接口 */public interface IShoeContract { interface IModel extends IBaseModel { void getData(String url,MCallBack mCallBack); void getDatas(String url,MCallBack mCallBack); interface ModelCallBack{ void success(String string); void error(Throwable throwable); } } interface IView extends IBaseView { void success(String string); void error(Throwable throwable); } interface IPresenter { void getData(String url); void getDatas(String url); }}三、Presenter层
package com.qffxl.qffxl20190102.presenter;import com.qffxl.qffxl20190102.base.mvp.BasePresenter;import com.bwie.com.qffxl.qffxl20190102.contract.IShoeContract;import com.bwie.com.qffxl.qffxl20190102.model.ShoeModel;/** * @auther: 清风扶细柳 * @Date: 2019/1/2 * @Time:下午 07:55 * 数据对应的Presenter 层 出来处理逻辑 */public class ShoePresnter extends BasePresenter<HomeModel, IHomeContract.IView> implements IHomeContract.IPresenter { @Override protected HomeModel initsModel() { return new ShoeModel(); } @Override public void getData(String url) { model.getData(url, new IShoeContract.IModel.MCallBack() { @Override public void success(Object data) { getView().success(data); } @Override public void error(Throwable throwable) { getView().error(throwable); } }); } @Override public void getDatas(String url) { model.getDatas(url, new IShoeContract.IModel.MCallBack() { //请求数据成功的 方法 @Override public void success(String string) { getView().success(string); }//请求数据失败的 方法 @Override public void error(Throwable throwable) { getView().error(throwable); } }); }}四、modle 层
package com.bwie.com.qffxl.qffxl20190102.model;import android.util.Log;import com.bwie.com.qffxl.qffxl20190102.base.mvp.IBaseModel;import com.bwie.com.qffxl.qffxl20190102.contract.IHomeContract;import com.bwie.com.qffxl.qffxl20190102.entity.FlowEntity;import com.bwie.com.qffxl.qffxl20190102.model.entity.ProductEntity;import com.bwie.com.qffxl.qffxl20190102.utils.VolleyUtil;import com.google.gson.Gson;/** * @auther: 清风扶细柳 * @Date: 2019/1/2 * @Time:下午 08:05 * model层 用来处理数据 请求网络 */public class ShoeModel implements IHomeContract.IModel { @Override public void getData(String url, final MCallBack mCallBack) { Volley.getInstance().Get(url, new Volley.VCallBack() { @Override public void success(String response) { //请求网络数据 //成功的回调方法 } @Override public void error(Throwable throwable) { //错误的回调方法 } }); } @Override public void getDatas(String url, final MCallBack mCallBack) { Volley.getInstance().Get(url, new Volley.VCallBack() { @Override public void success(String response) { //请求网络数据 //成功的回调方法 } @Override public void error(Throwable throwable) { //错误的回调方法 } }); }}