Android 组件化/模块化之路——在展示层搭建MVP结构
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结构的更多相关文章
- App 组件化/模块化之路——Android 框架组件(Android Architecture Components)使用指南
面对越来越复杂的 App 需求,Google 官方发布了Android 框架组件库(Android Architecture Components ).为开发者更好的开发 App 提供了非常好的样本. ...
- App 组件化/模块化之路——如何封装网络请求框架
App 组件化/模块化之路——如何封装网络请求框架 在 App 开发中网络请求是每个开发者必备的开发库,也出现了许多优秀开源的网络请求库.例如 okhttp retrofit android-asyn ...
- App 组件化/模块化之路——使用SDK的思路进行模块化设计接口
在不久之前分享一篇<App 组件化/模块化之路——如何封装网络请求框架>文章介绍了我在项目中封装网络请求框架的思路.开发一个 App 会涉及到很多网络请求 API ,例如登录注册接口.用户 ...
- App 组件化/模块化之路——构建开发架构思路
App 组件化/模块化开发架构思路 随着业务的发展 App 开发技术也越来越成熟,对开发者来说 App 代码量也迅速地增长到一个数量级.对于如何架构 App 已经每个开发者面临的实际问题.好的架构可以 ...
- App 组件化/模块化之路——Repository 模式
什么是 Repository 模式 Repository 这个词直译过来仓库.仓储的意思.这个意思其实也能反应出 Repository 模式作用.App 开发中少不了对数据的操作,数据的来源可能有很多 ...
- 教你打造一个Android组件化开发框架
*本篇文章已授权微信公众号 guolin_blog (郭霖)独家发布 CC:Component Caller,一个android组件化开发框架, 已开源,github地址:https://github ...
- Android组件化框架设计与实践
在目前移动互联网时代,每个 APP 就是流量入口,与过去 PC Web 浏览器时代不同的是,APP 的体验与迭代速度影响着用户的粘性,这同时也对从事移动开发人员提出更高要求,进而移动端框架也层出不穷. ...
- 我所理解的Android组件化之通信机制
之前写过一篇关于Android组件化的文章,<Android组件化框架设计与实践>,之前没看过的小伙伴可以先点击阅读.那篇文章是从实战中进行总结得来,是公司的一个真实项目进行组件化架构改造 ...
- Android组件化
附:Android组件化和插件化开发 App组件化与业务拆分那些事 Android项目架构之业务组件化 Android组件化核心之路由实现 Android组件化开发实践
随机推荐
- android源码、博文2
每周精选 第 54 期 精品源码 仿网易新闻app下拉标签选择菜单 仿网易新闻app下拉标签选择菜单,长按拖动排序,点击增删标签控件##示例 https://github.com/we ...
- spring注解大全
出自http://www.cnblogs.com/xiaoxi/p/5935009.html 1.@Autowired @Autowired顾名思义,就是自动装配,其作用是为了消除代码Java代码里面 ...
- Mac之OS系统下搭建JavaEE环境 <四> 之IntelliJ IDEA 的内存优化
1.代开IntelliJ IDEA 的显示内容 2. 打开idea.vmoptions文件 路径为Contens——bin——idea.vmoptions 修改之前会复制一份备份原配置 原配置 修改后 ...
- Java面向对象之抽象类,接口
抽象类: 含有抽象方法的类被声明为抽象类 抽象方法由子类去实现 含有抽象方法的类必须被声明为抽象类 抽象类被子类继承,子类(如果不是抽象类)必须重写抽象类中的所有抽象方法 抽象方法: 声明而未被实现的 ...
- 【期望DP】
[总览] [期望dp] 求解达到某一目标的期望花费:因为最终的花费无从知晓(不可能从$\infty$推起),所以期望dp需要倒序求解. 设$f[i][j]$表示在$(i, j)$这个状态实现目标的期望 ...
- TypeScript--变量及类型的那些事儿
变量(类型)声明 格式:关键字 变量名称:类型=值 (强类型) / 关键字 变量名称=值 例子: Array数组声明 Tuple元组类型 声明一个包含多类型的数组: Enum枚举类 ...
- iOS开发实战-时光记账Demo 网络版
之前写了一个本地数据库版本 戳这里 现在这个就是增加了后台 登录注册页面以及web的上传记录展示页面 含有少量php有兴趣可以看下 另外demo中包括数据库操作.json.网络请求等都没有用到第三方库 ...
- QT QT creator QTsdk的区别
Qt是一个跨平台的C++图形用户界面应用程序框架.它提供给应用程序开发者建立艺术级的图形用户界面所需的所用功能.Qt是完全面向对象的,很容易扩展,并且允许真正地组件编程. QT Creator 跨平台 ...
- log4g 使用教程
日志是应用软件中不可缺少的部分,Apache的开源项目log4j是一个功能强大的日志组件,提供方便的日志记录.在apache网站:jakarta.apache.org/log4j 可以免费下载到Log ...
- Java中实现十进制数转换为二进制的三种思路
Java中实现十进制数转换为二进制 第一种:除基倒取余法 这是最符合我们平时的数学逻辑思维的,即输入一个十进制数n,每次用n除以2,把余数记下来,再用商去除以2...依次循环,直到商为0结束,把余数倒 ...