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组件化开发实践 
随机推荐
- PAT-1099(Build A Binary Search Tree)
			题目见这里 分析:分四步进行 1)根据给定的结点情况建二叉树 2)对输入的键值排序(asending) 3)对二叉树中序遍历,同时对应赋key值 4)层次遍历(队列应用) 题目并不困难,但是我误入了 ... 
- 使用C#在VS中开发:未处理AccessViolationException “System.AccessViolationException”类型的未经处理的异常
			未处理AccessViolationException: “System.AccessViolationException”类型的未经处理的异常在System.Data.dll中发生 其他信息:尝试读 ... 
- js&jquery跨域详解jsonp,jquery并发大量请求丢失回调bug
			URL 说明 是否允许通信 http://www.a.com/a.js http://www.a.com/b.js 同一域名下 允许 http://www.a.com/lab/a.js http:/ ... 
- eclipse上传新项目到GitHub
			1.登录gibhub,创建一个仓库 2.提交本地仓库 右键本地项目 选择git,然后点击next 如图: 再右键项目,commit项目,这是提交到本地git 3.接下来提交到github 输入gith ... 
- Hadoop的配置过程(虚拟机中的伪分布模式)
			1引言 hadoop如今已经成为大数据处理中不可缺少的关键技术,在如今大数据爆炸的时代,hadoop给我们处理海量数据提供了强有力的技术支撑.因此,了解hadoop的原理与应用方法是必要的技术知识. ... 
- koa2 use里面的next到底是什么
			koa2短小精悍,女人不爱男人爱. 之前一只有用koa写一点小程序,自认为还吼吼哈,知道有一天某人问我,你说一下 koa或者express中间件的实现原理.然后我就支支吾吾,好久吃饭都不香. 那么了解 ... 
- Android高效内存之让你的图片省内存
			Android高效内存之让你的图片省内存 在做内存优化的时候,我们发现除了解决内存泄露问题,剩下的就只有想办法减少真实的内存占用.而在App中,大部分内存可能被我们图片占用了,所以减少图片的内存占用可 ... 
- Spring阅读方法
			转自:http://www.cnblogs.com/xing901022/p/4178963.html 最近没什么实质性的工作,正好有点时间,就想学学别人的代码.也看过一点源码,算是有了点阅读的经验, ... 
- [HNOI2006]超级英雄 网络流+二分版
			刚学网络流的我这里有一道非常好的"网络流练手题"------[HNOI2006]超级英雄. 记得很久以前真的有这个节目来着,还是大兵主持的. 其实这是一道匈牙利板子大水题,但对于我 ... 
- JVM学习笔记二:垃圾收集算法
			垃圾回收要解决的问题: 哪些内存需要回收? 线程私有区域不需要回收,如PC.Stack.Native Stack:Java 堆和方法区需要 什么时候回收? 以后的文章解答 如何回收? 首先进行对象存活 ... 
