Android中怎么应用MVP架构

首先,啥是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

猜你喜欢

转载自blog.csdn.net/myth13141314/article/details/81407711
今日推荐