美文网首页
简单实现android中MVP架构

简单实现android中MVP架构

作者: yangzai | 来源:发表于2016-05-05 12:22 被阅读295次

如果还不知道MVP是什么,请自行google了,我这里是简单实现MVP的框架,就是将Activity,或Fragment复制一份,真正的Activity、fragment负责V层,复制的Activity、Fragment充当P层。我们先看看代码,分析下是如何封装的,以便于我们充分理解后进行扩展


复制Activity其实就是让我们的presenter实现BasePresenterInterface接口,实现activity各个生命周期的方法,然后在Activity的生命周期中调用这些方法,这样presenter看上去就像一个Activity了,有点像包装设计模式,持有一个真正Activity的引用

BasePresenterInterface:

    public interface BasePresenterInterface {
    
        void onCreate(Bundle bundle);
        
        void onStart();
        
        void onResume();
        
        void onPause();
        
        void onDestroy();
        
        void onStop();
    }

复制Activity:

    /**
     * Created by zhangy on 2016/4/15.
     * <p/>
     * des : 将presenter与UI层绑定
     */
    public abstract class BaseMVPActivity<T extends BasePresenter<U>, U extends BaseUI> extends FragmentActivity {//泛型控制,保证每个V层都有对应的P层
        //要绑定的Presenter,每个Activity都会有一个与自己对应的Presenter
        private T mPresenter;
    
        protected abstract T createPresenter();
        //这里的U是一个接口,定义了我们要返回的UI,例如,activity中有ListView,fragment,TextView等等,我们如果想暴露给外面,可以在这个接口中声明
        protected abstract U getUi();
    
        public T getPresenter() {
            return mPresenter;
        }
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            mPresenter = createPresenter();//创建Presenter
            mPresenter.onUiReady(getUi(), this);//给 P 层传递我们的 V 层(MVP)
            mPresenter.onCreate(getIntent().getExtras());
        }
    
        @Override
        protected void onStart() {
            super.onStart();
            mPresenter.onStart();
        }
    
        @Override
        public void onDestroy() {
            super.onDestroy();
            mPresenter.onUiDestroy(getUi());
            mPresenter.onDestroy();
        }
    
        @Override
        protected void onResume() {
            super.onResume();
            mPresenter.onResume();
        }
    
        @Override
        protected void onPause() {
            super.onPause();
            mPresenter.onPause();
        }
    
        @Override
        protected void onStop() {
            super.onStop();
            mPresenter.onStop();
        }
    }

请注意到我们在BaseMVPActivity中我们重写了Activity的生命周期方法,并调用presenter对应的方法,这相当于又复制出一个Activity,以后我们就可以像使用Activity一样使用presenter

从类名我们看到,在创建Activity的时候就必须创建一个与之对应的presenter,UI接口。这样我们的Activity只负责UI的显示,对应的presenter负责具体的业务逻辑,与数据交互,通过BaseUI接口暴漏Activity的成员变量,指定Activity的特殊展示。

BasePresenter:


    /**
     * Created by zhangy on 2016/4/15.
     */
    public class BasePresenter <U extends BaseUI> implements BasePresenterInterface {
    
        /**
         * 是否是Fragment 备用
         */
        private boolean mIsFragment;
        /** 绑定的V层,有可能是Activity、Fragment */
        private U mUi;
    
        private Activity mActivity;
    
        private Fragment mFragment;
    
        public BasePresenter(boolean isFragment){
            super();
            mIsFragment = isFragment;
        }
        /** 在Fragment中绑定的V层 */
        public void onFragmentAttach(Activity activity, Fragment fragment) {
            mActivity = activity;
            mFragment = fragment;
        }
        /** 绑定Activity */
        public void onUiReady(U ui,Activity activity) {
            mUi = ui;
            mActivity = activity;
        }
    
        /**
         * @author :zhangy
         *
         * @description : 在UI销毁时调用
         *
         *  DATE : 2016/4/15
         */
        public final void onUiDestroy(U ui) {
            onUiUnready(ui);
            mUi = null;
        }
    
        public U getUi() {
            return mUi;
        }
    
        public Activity getActivity() {
            return mActivity;
        }
    
        public Fragment getFragment() {
            return mFragment;
        }
    
        /**
         * @author :zhangy
         *
         * @description : 当Fragment或者Activity即将被销毁时调用,可用于取消监听事件、取消注册事件
         *
         *  DATE : 2016/4/15
         */
        public void onUiUnready(U ui) {
        }
    
        // 默认空实现Activity生命周期
        @Override
        public void onCreate(Bundle bundle) {
    
        }
    
        @Override
        public void onStart() {
    
        }
    
        @Override
        public void onResume() {
    
        }
    
        @Override
        public void onPause() {
    
        }
    
        @Override
        public void onDestroy() {
    
        }
    
        @Override
        public void onStop() {
    
        }
    }

在BasePresenter中主要是实现Activity、Fragment生命周期的方法,绑定V层。具体的业务由子类根绝UI接口扩展添加

我们看下BaseUI接口:

    public interface BaseUI {

        ListView getListView();//这里我只是举个例子,不一定每个页面都有listView
    }

使用方法很简单,在我们创建Activity时继承BaseMVPActivity,并创建对应的presenter,UI接口即可。例如我创建的Demo

    public class MainActivity extends BaseMVPActivity<MainPresenter, MainUI> implements MainUI {

        private ListView mListView;
        private MainPresenter mainPresenter;
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            mListView = (ListView) findViewById(R.id.list_view);
            loadData();
        }
    
        @Override
        public void loadData() {
            mainPresenter.loadData();
        }
    
        @Override
        protected MainPresenter createPresenter() {
            mainPresenter = new MainPresenter(false);
            return mainPresenter;
        }
    
        @Override
        protected MainUI getUi() {
            return this;
        }
    
    
        @Override
        public ListView getListView() {
            return mListView;
        }
    }

我们再来看下怎么实现presenter层,它又干了什么

    public class MainPresenter extends BasePresenter<MainUI> {
        /** Mode层管理类 */
        private FrontMode frontMode;
    
        public MainPresenter(boolean isFragment) {
            super(isFragment);
            frontMode = new FrontMode();//创建一个Mode层管理类
        }
    
        public void loadData() {
            /** 让Mode管理层去处理数据的请求,解析,我们只处理回调 */
            frontMode.requestData(getActivity(), new RequestListener() {
                @Override
                public void onSucces(List datas) {
                    setDatas(datas);
                }
                @Override
                public void onFail() {
    
                }
            });
        }
        /**
         * author : zhangy
         *
         * des : 给V层加载数据
         *
         * date : 2016/5/5
         */
        private void setDatas(List datas) {
            getUi().getListView().setAdapter(new ArrayAdapter(getActivity(), android.R.layout.simple_list_item_1, datas));
        }
    }

在presenter层我们把具体的业务逻辑分离出来,将V层与M层解耦。再看下M层

    /**
     * Created by zhangy on 2016/5/5.
     * <p/>
     * MVP中的M层,处理网络请求,数据解析、数据封装,与Bean、presenter交互
     */
    public class FrontMode {
        /**
         * author : zhangy
         * <p/>
         * des : 这里的数据请求可以换成volley、okHttp.
         * <p/>
         * date : 2016/5/5
         */
        public List requestData(final Activity activity, final RequestListener listener) {
            final ArrayList datas = new ArrayList();
            //模拟数据请求
            new Thread(new Runnable() {
    
                @Override
                public void run() {
                    SystemClock.sleep(2000);//模拟耗时
                    datas.add("pfg");
                    datas.add("124");
                    datas.add("234");
                    datas.add("456");
                    datas.add("567");
    
                    if (datas.isEmpty()) {
                        activity.runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                listener.onFail();
                            }
                        });
                    } else {
                        activity.runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                listener.onSucces(datas);
                            }
                        });
                    }
                }
            }).start();
            return datas;
        }
    }

    //回调接口
    public interface RequestListener {
    
       void onSucces(List datas);
    
        void onFail();
    }

所有的数据相关的处理都放在FrontMode统一管理。这里我用的是线程模拟数据请求,大家可以继承喜欢的网络框架。

通过上面的框架我们就简单的实现了MVP模型,以后代码的管理维护更简单,思路清晰,分工明确。


感兴趣的童鞋可以到我的github上下载。记得star下(!_!

相关文章

网友评论

      本文标题:简单实现android中MVP架构

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