美文网首页AndroidAndroid技术知识Android知识
通过代码封装搭建合适的MVP开发架构模式

通过代码封装搭建合适的MVP开发架构模式

作者: 伪文艺代表 | 来源:发表于2017-07-27 11:25 被阅读154次

    前言

    在Android项目开发中,MVP架构的使用或许已经不是什么新鲜的事,现在网上的教程也非常多,而且Google也在GitHub上给出了实例。

    不过有时候在项目开发过程中,也不完全照搬别人是怎样写的,重要的是自己理清MVP架构的思想,通过代码的封装,搭建合适自己开发常用的模式。(本文不会讲解什么是MVP架构,如果还没熟悉这种架构模式,请自行百度或谷歌咯)

    接下来谈谈我是怎样通过代码封装来搭建合适我自己的MVP构架吧。

    MVP架构模式的父类实现

    • BaseView

    View层的父类。将常用的View层操作抽象出来,写成一个接口,具体的实现由Activity或Fragment来完成。

    例如,在View层上,通过网络请求数据然后展示数据这样的一个过程,一般我是分成这几个步骤:

    1. 网络请求开始前,需要打开数据加载框
    2. 网络请求结束后,需要关闭数据加载框
    3. 网络请求成功后,需要在view上显示数据
    4. 网络请求失败后,需要在View上提示原因
    

    转换成代码:

    public interface BaseView<T> {
    
        /**
         * 打开加载框
         */
        void startLoadView();
    
        /**
         * 关闭加载框
         */
        void stopLoadView();
    
        /**
         * 网络请求成功后回调
         * @param data
         */
        void onSuccess(T data);
    
        /**
         * 网络请求失败后回调
         * @param msg
         */
        void onFail(String msg);
    
    }
    
    • BaseRequestCallBack

    数据请求的回调接口(我这里一般都是都过网络请求数据),在MVP架构模式中,Model层获取到数据后,会将数据交给Presenter中间层,最后再交回给View层,而在View层上的一些常用的操作,例如上面的讲解中提到的相对应,在不同的请求周期中对应不同的操作,而接口的具体的实现由Presenter层来完成。

    public interface BaseRequestCallBack<T> {
    
        /**
         * 网络请求开始前回调
         */
        void RequestBefore();
    
        /**
         * 网络请求失败后回调
         */
        void RequestFail(String msg);
    
        /**
         * 网络请求成功后回调
         * @param data
         */
        void RequestSuccess(T data);
    
        /**
         * 网络请求结束后回调
         */
        void RequestComplete();
    }
    
    • BasePresenter

    Presenter层的父类,是Model层和View层之间的桥梁。上面说到的BaseRequestCallBack接口就是由BasePresenter来实现。

    因为Presenter层是中间层,所以要持有View层的引用,继而完成数据的传递和完成不同的请求周期中对应View层的操作。

    看看BasePresenter的代码:

    public class BasePresenter <T> implements BaseRequestCallBack<T> {
    
        private BaseView mView; //持有View层的引用
    
        public BasePresenter(BaseView mView, Context context) {
            this.mView = mView;
        }
    
    
        /**
         * 以下的回调方法对应View层的相应操作
         */
    
        @Override
        public void RequestBefore() {
            mView.startLoadView();
        }
    
        @Override
        public void RequestFail(String msg) {
            mView.onFail(msg);
        }
    
        @Override
        public void RequestSuccess(T data) {
            mView.onSuccess(data);
        }
    
        @Override
        public void RequestComplete() {
            mView.stopLoadView();
        }
    }
    
    • BaseModel

    Model层的父类。一般得看开发者的需要,通过怎样的方式或框架去获取数据,然后进行相应的实现或参数的配置(网络请求框架,数据库框架等)

    因为获取数据后,Model层需要将数据传递给Presenter层,所以在Model层需要持有Presenter层的引用。在这里,BaseRequestCallBack就可以派上用场了,直接可以对应网络请求框架的一些生命周期。

    因为这里不同的开发者使用的网络请求方式不一样,所以这里我就贴出创建BaseRequestCallBack实例的代码。下面的注释掉的代码,就是我自己通过OKHTTP封装的网络请求框架。

    public class BaseModel {
        //public NetworkRequestClient httpClient;
        private BaseRequestCallBack callBack;
    
        public BaseModel(BaseRequestCallBack callBack) {
            //httpClient = NetworkRequestClient.getInstance();
            this.callBack = callBack;
        }
    
         // public NetworkExecutor getExecutor(Class<?> mClass) {
        //     NetworkExecutor networkExecutor = new NetworkExecutor(new NetworkRequestListener() {
        //         @Override
        //         public void onRequestBefore() {
        //             callBack.requestBefore();
        //         }
    
        //         @Override
        //         public void onRequestSuccess(Object object) {
        //             callBack.requestSuccess(object);
        //         }
    
        //         @Override
        //         public void onRequestFail(String msg) {
        //             callBack.requestFail(msg);
        //         }
    
        //         @Override
        //         public void onRequestComplete() {
        //             callBack.requestComplete();
        //         }
    
        //     },mClass);
        //     return networkExecutor;
        // }
    
    }
    

    总结

    这就是我通过代码封装搭建的一套MVP开发架构模式,当然每个人都可以持有不同的见解,这里只是提出我的一些做法,如有做的不好,还望指点。我就不贴具体的Activity的代码了,如果需要的话可以,去我的Github上拿。

    最后,小弟不才,还望多多指教!

    相关文章

      网友评论

        本文标题:通过代码封装搭建合适的MVP开发架构模式

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