Android 组件化/模块化之路——在展示层搭建MVP结构

简介: Android 组件化/模块化之路——在展示层搭建MVP结构 什么是MVP Model–View–Presenter (MVP) 源于 Model–View–Controller (MVC) 的结构设计模式,它是用于展示层(Presentation)的结构。

Android 组件化/模块化之路——在展示层搭建MVP结构

什么是MVP

Model–View–Presenter (MVP) 源于 Model–View–Controller (MVC) 的结构设计模式,它是用于展示层(Presentation)的结构。

MVP 中的 Presenter 是 “中间人”角色,它的功能是在 Model–View–Presenter 三者中起到连接和协作的作用。程序中的大部分的逻辑都应该在 Presenter 中实现。

modelviewpresenter

  • Model 定义了数据的访问接口。例如之前文章 《App 组件化/模块化之路——Repository 模式》 就介绍了使用 Repository 实现数据访问的一种方式。
  • View 定义了展示数据的接口,以及转发用户的指令
  • Presenter 是连接 Model 与 View 的桥梁,是它们的协作者。

接下来我们就开始搭建通用的 MVP 结构了。

Model

Model 的实现主要是根据业务,我们这里是推荐使用 Repository 来实现,可以参考文章 《App 组件化/模块化之路——Repository 模式》

View

首先我们定义 View 接口,这里定义了一个请求的通用流程 onStart()onFinished()onError() 等方法。

  

public interface IView<T> {
    Activity getActivity();

    /**
     * 请求开始
     */
    void onStart();

    /**
     * 请求结束
     */
    void onFinished();

    /**
     * 请求出错
     * @param errorCode
     * @param message
     */
    void onError(int errorCode, String message);
}

 

Presenter

先定义 IPresenter, 接口很简单,是 Presenter 创建和注销的过程。

  

public interface IPresenter {

    void onCreate();

    void onDestroy();
}

 

然后定义 BasePresenter,这个是 Presenter 是各个具体业务实现的基类。

  

public abstract class BasePresenter<T extends IView> implements IPresenter {

    public static final int ERROR_RX = 2000;

    public T view;

    public BasePresenter(T view) {
        this.view = view;
    }

    @Override
    public void onCreate() {

    }

    Activity getActivity() {
        return view.getActivity();
    }

    /**
     * 用于判断当前view是否已经退出
     *
     * @return
     */
    public boolean isViewDetached() {
        if (view == null) {
            return true;
        }
        if (view.getActivity() == null) {
            return true;
        }

        if (view.getActivity().isFinishing()) {
            return true;
        }
        return false;
    }

    public String getRxErrorText() {
        return view.getActivity().getString(R.string.error_network);
    }

    @Override
    public void onDestroy() {
        view = null;
    }
}

 

Contract

使用 Contract 模式的好处就是,如果我们的业务需求很多,那么在展示层(Presentation)中就会出现了大量的 MVP 文件。这样对于后续维护工作是一件非常令人头痛的事情,所以使用 Contract 来规范 View 和 Presenter 文件。这样具体业务只要找到 Contract 文件,就可以知道这个业务的具体接口有哪些了。

其中 Contract 下面的 View 是定义具体业务的接口了。该类可以在 UI(例如Activity或Fragment)中实现它。

  

public interface DemoContract {

    interface View extends IView {
        void onGetDataFinished(String data);
        //other callbacks
    }

    interface Presenter extends IPresenter {
        void getData();
        //other mehtods
    }
}

 

那么在具体实现 Presenter 时,这里的 Repository 就是 Model了。使用它可以对数据进行访问和存储。

  

public class DemoPresenter extends BasePresenter<DemoContract.View> implements DemoContract.Presenter {
      DemoRepository repository;
    public DemoPresenter(DemoContract.View view) {
        super(view);
    }

    @Override
    public void getData() {
        view.onGetDataFinished("");
    }
}

 

Client

客户端的使用基本上是在 Android View 组件。例如

  

public class DemoActivity extends AppCompatActivity implements DemoContract.View {

    DemoPresenter mPresenter;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mPresenter = new DemoPresenter(this);
        mPresenter.getData();//请求数据
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        mPresenter.onDestroy();
    }

    @Override
    public Activity getActivity() {
        return this;
    }

    @Override
    public void onGetDataFinished(String data) {
        // 这里获取到数据
    }

    @Override
    public void onBegin() {
        //请求开始,可以显示loading等操作
    }

    @Override
    public void onFinished() {
        //请求结束,取消loading等操作
    }

    @Override
    public void onError(int errorCode, String message) {
        //处理出错
    }
}

 

参考文献

https://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93presenter

https://github.com/googlesamples/android-architecture

微信关注我们,可以获取更多

目录
相关文章
|
6月前
|
XML 前端开发 测试技术
Android基础知识:解释Android的MVC和MVP模式。
Android基础知识:解释Android的MVC和MVP模式。
66 0
|
6月前
|
Java 关系型数据库 数据库
Android App连接真机步骤与APP的开发语言和工程结构讲解以及运行实例(超详细必看)
Android App连接真机步骤与APP的开发语言和工程结构讲解以及运行实例(超详细必看)
98 0
|
存储 移动开发 ARouter
Android组件化开发,从未如此简单
组件化方式的开发,有很多的文章去阐述,而本篇的特点,在于有实际的组件化实战代码,有开源的组件化Demo样例,重在浅显易懂,重在能够应用于实际业务,也重在简单。
357 0
|
19天前
|
前端开发 Java 测试技术
android MVP契约类架构模式与MVVM架构模式,哪种架构模式更好?
android MVP契约类架构模式与MVVM架构模式,哪种架构模式更好?
28 0
|
6月前
|
设计模式 前端开发 Android开发
Android应用开发中的MVP架构模式解析
【5月更文挑战第25天】本文深入探讨了在Android应用开发中广泛采用的一种设计模式——Model-View-Presenter (MVP)。文章首先概述了MVP架构的基本概念和组件,接着分析了它与传统MVC模式的区别,并详细阐述了如何在实际开发中实现MVP架构。最后,通过一个具体案例,展示了MVP架构如何提高代码的可维护性和可测试性,以及它给开发者带来的其他潜在好处。
|
1月前
|
前端开发 Java 测试技术
android MVP契约类架构模式与MVVM架构模式,哪种架构模式更好?
android MVP契约类架构模式与MVVM架构模式,哪种架构模式更好?
22 2
|
2月前
|
开发工具 Android开发 git
Android实战之组件化中如何进行版本控制和依赖管理
本文介绍了 Git Submodules 的功能及其在组件化开发中的应用。Submodules 允许将一个 Git 仓库作为另一个仓库的子目录,有助于保持模块独立、代码重用和版本控制。虽然存在一些缺点,如增加复杂性和初始化时间,但通过最佳实践可以有效利用其优势。
39 3
|
2月前
|
ARouter 测试技术 API
Android经典面试题之组件化原理、优缺点、实现方法?
本文介绍了组件化在Android开发中的应用,详细阐述了其原理、优缺点及实现方式,包括模块化、接口编程、依赖注入、路由机制等内容,并提供了具体代码示例。
47 2
|
3月前
|
移动开发 前端开发 weex
Android项目架构设计问题之模块化后调用式通信如何解决
Android项目架构设计问题之模块化后调用式通信如何解决
17 0
|
6月前
|
存储 前端开发 Java
Android应用开发中的MVP架构模式实践
【5月更文挑战第5天】随着移动应用开发的复杂性增加,传统的MVC(Model-View-Controller)架构在应对大型项目时显得笨重且不灵活。本文将探讨一种更适应现代Android应用开发的架构模式——MVP(Model-View-Presenter),并展示如何在Android项目中实现该模式以提升代码的可维护性和可测试性。通过对比分析MVP与传统MVC的差异,以及提供一个实际案例,读者将能深入了解MVP的优势和实施步骤。