Android中怎么应用MVP架构

作者: AntDream | 来源:发表于2017-11-01 21:31 被阅读131次

    首先,啥是MVP架构?

    MVP架构是一种组织代码的形式结构,全称是Model View Presenter,其中每一个单词代表架构中的一部分,即分别为Model:处理数据相关的,View:界面显示的,Presenter:连接View和Model的中介

    MVP架构有啥优势和特点

    • 首先,MVP能够有效地降低View的复杂性。一般我们把Activity和Fragment看作是View,用来处理界面UI的显示和更新。而MVP则是把Activity和Fragment中的跟业务逻辑相关的代码抽离出来,从而解耦View元素和业务逻辑
    • MVP模式可以让UI界面和数据分离,我们的应用至少可以分为3层,这样使得我们也可以对这3个层次进行独立的单元测试
    • MVP并不是一个标准化的模式,可以根据自己的需求修正MVP的实现方式。只要保证我们是通过Presenter将View和Model解耦合、降低类型复杂度、各个模块可以独立测试、独立变化,这就是正确的方向

    如何在项目中应用MVP模式

    下面我们直接通过代码来演示如何用MVP架构来组织代码
    • 首先抽离出具体的业务逻辑接口,这里简单起见,就定义了一个获取数据的接口
    public interface MvpContact {
    
        interface Presenter {
            /**
             * 获取数据
             */
            void getData();
        }
    
        interface View {
            /**
             * 更新数据到View
             */
            void showData();
    
            /**
             * 弹出错误提示
             */
            void showError();
        }
    }
    
    • 上述的MvpContact类里面包含了2部分接口,Presenter接口里面是具体的数据请求,View层通过调用这个接口发起数据请求;View接口则是用于更新UI界面的接口
    public class MvpModel {
    
        public void getData(GetDataListener listener) {
            //执行具体的请求
    
            //请求失败
            listener.onError();
    
            //请求成功
            listener.onSuccess();
        }
    }
    
    • 上面的MvpModel类对应MVP中的Model层,专门负责处理数据,比如网络请求或是从本地获取数据。参数里的接口用于将数据请求的结果回调。
    public interface GetDataListener {
        /**
         * 请求失败
         */
        void  onError();
    
        /**
         * 请求成功
         */
        void onSuccess();
    
    }
    
    • 下面我们来看看Presenter层的MvpPresenter类
    public class MvpPresenter implements MvpContact.Presenter{
    
        MvpContact.View view;
        MvpModel model;
    
        public MvpPresenter(MvpContact.View mView) {
            view = mView;
            model = new MvpModel();
        }
    
        @Override
        public void getData() {
            model.getData(new GetDataListener() {
                @Override
                public void onError() {
                    //请求失败弹出提示等
                    view.showError();
                }
    
                @Override
                public void onSuccess() {
                    //请求成功更新数据到UI
                    view.showData();
                }
            });
        }
    }
    
    • 首先MvpPresenter在初始化的时候会与View绑定,并初始化用于处理数据的MvpModel,以便进行数据处理
    • MvpPresenter里面实现了MvpContact中的Presenter接口,接口里面调用MvpModel的getData方法来进行数据请求,这样就将View层发起的数据请求转发给了Model层来处理,并通过GetDataListener接口回调数据处理的结果
    • 数据处理回调以后,通过更新UI的接口来把结果更新到UI上。下面我们来看看MVP中的View层,这里我们以一个Activity代表
    public class MvpActivity extends Activity implements MvpContact.View{
    
        MvpPresenter presenter;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_mvp);
    
            presenter = new MvpPresenter(this);
    
            //请求数据
            presenter.getData();
        }
    
        @Override
        public void showData() {
    
        }
    
        @Override
        public void showError() {
    
        }
    }
    
    • 首先,MvpActivity在onCreate方法中初始化Presenter,并通过调用Presenter的getData接口发起数据请求
    • MvpActivity通过实现MvpContact的中View接口来获取数据请求的结果回调,并进行相应的反应,比如更新UI或是弹出错误提示

    以上就是MVP的简单应用啦!是不是很简单?

    MVP架构的应用是很灵活的,可以根据需要进行修改。比如上面我们实现的MVP模式中,Model层通过设置Listener将处理结果回调给Presenter层,这就会有一个问题:当Model层中的数据处理方法比较多的时候,我们就需要写很多的回调接口了,因为可能每个数据请求成功返回的结果都是不同的实体!

    我们可以将上面的实现修改一下,直接在Presenter里面进行数据的处理,把Model给撇掉,对应修改后的MvpPresenter类如下

    public class MvpPresenter implements MvpContact.Presenter{
    
        MvpContact.View view;
    
        public MvpPresenter(MvpContact.View mView) {
            view = mView;
        }
    
        @Override
        public void getData() {
            //执行具体的请求
    
            //请求失败弹出提示等
            view.showError();
    
            //请求成功更新数据到UI
            view.showData();
        }
    }
    

    好了,以上就是MVP在Android中的简单应用了。

    当然架构有很多种,除了这里介绍的MVP,还有MVVM、MVC等。我们的目标是让我们的项目结构更加合理,扩展性更强,能够拥抱变化。每种架构都有其特点和优势,可以根据实际需要来选择。


    最后有兴趣的小伙伴可以学习一下Google官方的示例

    Google官方的MVP项目


    欢迎关注我的微信公众号,期待与你一起学习,一起交流,一起成长!


    AntDream

    相关文章

      网友评论

        本文标题:Android中怎么应用MVP架构

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