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

什么是MVP

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

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

  • 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

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

Android 组件化/模块化之路——在展示层搭建MVP结构的更多相关文章

  1. App 组件化/模块化之路——Android 框架组件(Android Architecture Components)使用指南

    面对越来越复杂的 App 需求,Google 官方发布了Android 框架组件库(Android Architecture Components ).为开发者更好的开发 App 提供了非常好的样本. ...

  2. App 组件化/模块化之路——如何封装网络请求框架

    App 组件化/模块化之路——如何封装网络请求框架 在 App 开发中网络请求是每个开发者必备的开发库,也出现了许多优秀开源的网络请求库.例如 okhttp retrofit android-asyn ...

  3. App 组件化/模块化之路——使用SDK的思路进行模块化设计接口

    在不久之前分享一篇<App 组件化/模块化之路——如何封装网络请求框架>文章介绍了我在项目中封装网络请求框架的思路.开发一个 App 会涉及到很多网络请求 API ,例如登录注册接口.用户 ...

  4. App 组件化/模块化之路——构建开发架构思路

    App 组件化/模块化开发架构思路 随着业务的发展 App 开发技术也越来越成熟,对开发者来说 App 代码量也迅速地增长到一个数量级.对于如何架构 App 已经每个开发者面临的实际问题.好的架构可以 ...

  5. App 组件化/模块化之路——Repository 模式

    什么是 Repository 模式 Repository 这个词直译过来仓库.仓储的意思.这个意思其实也能反应出 Repository 模式作用.App 开发中少不了对数据的操作,数据的来源可能有很多 ...

  6. 教你打造一个Android组件化开发框架

    *本篇文章已授权微信公众号 guolin_blog (郭霖)独家发布 CC:Component Caller,一个android组件化开发框架, 已开源,github地址:https://github ...

  7. Android组件化框架设计与实践

    在目前移动互联网时代,每个 APP 就是流量入口,与过去 PC Web 浏览器时代不同的是,APP 的体验与迭代速度影响着用户的粘性,这同时也对从事移动开发人员提出更高要求,进而移动端框架也层出不穷. ...

  8. 我所理解的Android组件化之通信机制

    之前写过一篇关于Android组件化的文章,<Android组件化框架设计与实践>,之前没看过的小伙伴可以先点击阅读.那篇文章是从实战中进行总结得来,是公司的一个真实项目进行组件化架构改造 ...

  9. Android组件化

    附:Android组件化和插件化开发 App组件化与业务拆分那些事 Android项目架构之业务组件化 Android组件化核心之路由实现 Android组件化开发实践

随机推荐

  1. Configure: error: freetype.h not found. 的解决办法

    出现 Configure: error: freetype.h not found. 的解决办法 CentOS yum install freetype-devel Debian apt-get in ...

  2. Vijos 1010 清帝之惑之乾隆

    背景 乾隆,雍正的第四子,在位60年,退位后又当了三年太上皇,终年89岁. 乾隆即位之初,实行宽猛互济的政策,务实足国,重视农桑,停止捐纳,平定叛乱等一系列活动中,充分体现了他的文治武功,乾隆帝向慕风 ...

  3. raft如何实现leadership transfer

    leadership transfer可以把raft group中的leader身份转给其中一个follower.这个功能可以用来做负载均衡,比如可以把leader放在性能更好的机器或者离客户端更近的 ...

  4. Java基础语法<八> 继承

    1.超类和子类 超类和子类 父类与子类 多态: 一个对象变量可以指示多种实际类型的现象称为多态 一个变量可以引用父类对象,也可以引用其子类对象,这就是多态. 不能将一个超类的引用赋给子类变量,因为调用 ...

  5. Android创建窗口(一)创建应用窗口

    所谓的窗口(Window)就是一个显示在手机屏幕上可视化视图的一片区域.在Android中窗口是一个抽象的概念,每一个Activity就对应着一个窗口,而所有的窗口都是由视图(View)来呈现,而我们 ...

  6. Java虚拟机:JVM内存分代策略

    版权声明:本文为博主原创文章,转载请注明出处,欢迎交流学习! Java虚拟机根据对象存活的周期不同,把堆内存划分为几块,一般分为新生代.老年代和永久代(对HotSpot虚拟机而言),这就是JVM的内存 ...

  7. 线程池与Threadlocal

    线程池与Threadlocal 线程池: 线程池是为了使线程能够得到循环的利用,线程池里面养着一些线程,有任务需要使用线程的时候就往线程池里抓线程对象出来使用.线程池里的线程能够重复使用,所以在资源上 ...

  8. JS操作数组常用的方法

    JS操作Array对象的方法 concat(arr1,arr2,...):连接数组indexOf(value):返回数组中value的第一个索引join(separator):将数组中所有的元素连接由 ...

  9. PL/SQL学习笔记_01_基础

    PL/SQL语句可以在Oracle客户端的 SQL窗口或者 command  窗口中运行 在SQL窗口中运行步骤同 SQL语句 在command  窗口中运行的步骤如下: 1)File—new com ...

  10. STK卫星工具箱下载

    简介 STK的全称是Satellite Tool Kit(卫星工具箱),STK/Pro 9.0最新出品,完整版,是由Analytical Graphics公司开发的一款在航天工业领域中处于绝对领先地位 ...