美文网首页
Android开发中的的MVP模式

Android开发中的的MVP模式

作者: MengkZhang | 来源:发表于2017-05-09 17:00 被阅读0次

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

    1233754-5f7d98f12dc2496d.png

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

    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<IgnoreBean> call = service.getNoAnswer(route);
            call.enqueue(new Callback<IgnoreBean>() {
                @Override
                public void onResponse(Call<IgnoreBean> call, Response<IgnoreBean> 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<IgnoreBean> 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<IgnoreBean.DataBean.ResultDataBean> 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模式

          本文链接:https://www.haomeiwen.com/subject/vxhitxtx.html