Android开发中的的MVP模式

MVP,全称 Model-View-Presenter
1,为什么使用MVP?

Android开发中的的MVP模式_第1张图片
1233754-5f7d98f12dc2496d.png

大部分的安卓应用只使用View-Model结构
程序员现在更多的是和复杂的View打交道而不是解决业务逻辑。
当你在应用中只使用Model-View时,到最后,你会发现“所有的事物都被连接到一起”
god object
god object是十分复杂的,他的每一个部分都不能重复利用,无法轻易的测试、或者调试和重构。
使用 MVP
复杂的任务被分成细小的任务,并且很容易解决。越小的东西,bug越少,越容易debug,更好测试。在MVP模式下的View层将会变得简单,所以即便是他请求数据的时候也不需要回调函数。View逻辑变成十分直接。

Android开发中的的MVP模式_第2张图片
1233754-eb5b4bc4fbf757be.png

当你编写一个Actviity、Fragment、自定义View的时候,你会把所有的和后台任务相关的方法写在一个静态类或者外部类中。这样,你的Task不再和Activity联系在一起,这既不会导致内存泄露,也不依赖于Activity的重建。
这里有若干种方法处理后台任务,但是它们的可靠性都不及MVP。
2,项目中MVP 代码简介
M:Model 数据层,主要负责项目中的数据处理 如访问网络数据 访问数据库数据等等
V:View 视图层 主要负责视图的显示 开发中如Activity Fragment等等
P:Presenter 逻辑层 主要负责业务逻辑的处理 当然 也是连接Model层和View层的桥梁。
2.1 先写一个协议类Contract,用来放Model层 View层 presenter层的接口以及回调接口

 //---------------------Master Role  My Disabuse  unAnswered fragemtn-------------------------------------
    public interface IUnAnswerModel {
        void loadUnAnswerData(RequestBody route,OnUnAnswerListener listener);
    }

    public interface OnUnAnswerListener {
        void onError();
        void onSuccessUnAnswerData(IgnoreBean bean);
    }

    public interface IUnAnswerView {
        void showError();
        void setUnAnswerData(IgnoreBean bean);
    }

    public interface IUnAnswerPresenter {
        void getUnAnswerData(RequestBody route);
    }

2.2 写Model接口的实现类 这里进行访问网络的耗时操作


/**
 * Created by zhang on 2017/5/9.
 */
public class UnAnswerModelImpl implements PersonContract.IUnAnswerModel {
    @Override
    public void loadUnAnswerData(RequestBody route, final PersonContract.OnUnAnswerListener listener) {
        Retrofit retrofit = RetrofitSingleton.getInstance().getRetrofit();
        PersonService service = retrofit.create(PersonService.class);
        Call call = service.getNoAnswer(route);
        call.enqueue(new Callback() {
            @Override
            public void onResponse(Call call, Response response) {
                if (response != null && response.body() != null && response.body().getData() != null && response.body().getData().getResultData() != null) {
                    listener.onSuccessUnAnswerData(response.body());
                } else {
                    listener.onError();
                }
            }

            @Override
            public void onFailure(Call call, Throwable t) {
                listener.onError();
            }
        });
    }
}

2.3 Presenter接口的实现类 该类持有Model实现类的对象和View实现类的对象 进行逻辑处理


/**
 * Created by zhang on 2017/5/9.
 */
public class UnAnswerPresenterImpl implements PersonContract.IUnAnswerPresenter,PersonContract.OnUnAnswerListener {

    private PersonContract.IUnAnswerView mIUnAnswerView;
    private PersonContract.IUnAnswerModel mIUnAnswerModel;

    public UnAnswerPresenterImpl(PersonContract.IUnAnswerView mIUnAnswerView) {
        this.mIUnAnswerView = mIUnAnswerView;
        this.mIUnAnswerModel = new UnAnswerModelImpl();
    }

    @Override
    public void getUnAnswerData(RequestBody route) {
        mIUnAnswerModel.loadUnAnswerData(route,this);
    }

    @Override
    public void onError() {
        mIUnAnswerView.showError();
    }

    @Override
    public void onSuccessUnAnswerData(IgnoreBean bean) {
        mIUnAnswerView.setUnAnswerData(bean);
    }
}

2.4 View 的实现类 也就是Activity或者Fragment

public class UnAnswerFragment extends Fragment implements PersonContract.IUnAnswerView {

该类中持有presenter实现类的对象 用来获取数据

    private PersonContract.IUnAnswerPresenter mIUnAnswerPresenter;

实例化:
 mIUnAnswerPresenter = new UnAnswerPresenterImpl(this);

请求数据:

private void initData() {
        mParamsBean = new CommentParamBean.ParamsBean();
        if (mType == ANSWERED) {
            mParamsBean.setStatus("1");

        } else {
            mParamsBean.setStatus("0");
        }
        mParamsBean.setHasPublic("true");
        mRequestBody = Utils.set5param(UserSingleton.getInstance(getContext()).getId(), 10, page, 2, mParamsBean);
        mIUnAnswerPresenter.getUnAnswerData(mRequestBody);
    }

请求数据后的回调方法


    @Override
    public void showError() {
        Logger.e("------请求数据失败---------");
        mKProgressHUD.dismiss();
    }

    @Override
    public void setUnAnswerData(IgnoreBean bean) {
        Logger.e(bean.toString());
        List resultData = bean.getData().getResultData();
        totalPage = bean.getData().getPageModel().getTotalPage();
        if (isRefresh) {
            mList.clear();
        }
        mList.addAll(bean.getData().getResultData());
        mAdapter.notifyDataSetChanged();
        if (isRefresh) {
            isRefresh = false;
            mXRecyclerView.refreshComplete();
        } else {
            mXRecyclerView.loadMoreComplete();
        }
        mKProgressHUD.dismiss();

    }

你可能感兴趣的:(Android开发中的的MVP模式)