MVP框架实现过程

目的:View层和Model层分离,中间由Presenter处理逻辑。

Prester作为View与Model交互的中间纽带,处理与用户交互的负责逻辑。这里我们只说明View和Presenter的交互, 
Model与Presenter与前者大致相同,甚至可以直接略过接口直接使用,因此不再赘述。

我们期望减少在Activity,Fragment类的容量,使View层专心View的实现,将逻辑由P层处理。

即存在对View实现的V和对逻辑实现的P,V中调用P的方法处理逻辑,P调用V处理View变化。那么怎样将两者联系在一起?

实现:

1、建立联系

如果想要在V中调用P的方法,只要在V中建立P的对象。即在V中,P p = new P(); 然后p.xx();

此时只是V单向的含有P的引用,让p拥有v的引用。理所当然,我们通过p.attachView(this); 传递this参数, 
使p对象拥有对应的v对象的引用。

同时,不能忘记使用p.detachView(); 目的是保持P和V的生命周期一致,即在V销毁时,P逻辑上也失去效用,也应销毁, 
防止由于P保持对V的引用,导致V无法销毁,内存溢出。

注:对于内存溢出,我们可以在P中attchView()和detachView()具体实现中使用弱引用的方式,强化防止内存溢出。


public class MvpView {private MvpPresenter presenter;public void onCreate(){presenter = new MvpPresenter();presenter.attachView(this);}public void onDestroy(){presenter.detachView();}
}public class MvpPresenter {private WeakReference<MvpView> viewRef;public void attachView(MvpView view) {viewRef = new WeakReference<>(view);}public void detachView() {if (viewRef != null) {viewRef.clear();viewRef = null;}}public void xx() {}
}

但是这里远远没有结束,我们不能忽略xx()。也就是


public void attachView(MvpView view) {viewRef = new WeakReference<>(view);
}

MvpView不能写死,因此需要使用接口,只是声明方法,无需关心方法的具体实现。(本人始终觉得接口最好用的在于分层后, 
Coder只需先关注于一层的逻辑,而无需在几层之间来回切换)由于下面将接口和连接的实现分离,这里不重复给出源码。、

2、实现复用(继承,泛型)

由于并不是只有某个View代码需要分离,同时实现连接的共同方法可以复用,这里我们需要实现V和P建立联系的实现的复用。

步骤有二,一是将不同View接口和实现连接的公共部分分离,公共部分抽离成父类,二是使得match的特定V和P相互联系。

1)如果单纯的抽离成父类,这十分简单,只需要将上述的代码直接copy到工程的BaseActivity或者BaseFragment中, 
或者单独隔离成继承Base类的MvpBase类。

无疑我们采取单独隔离成继承Base类的MvpBase类的方式,既是因为实现逻辑的分离,同时并不是所有View逻辑都适合分离出, 
也是因为为了下一步使得match的特定V和P相互联系。

2)这时假设我们有Va和Vb,都继承MvpView;同时有Pa和Pb,也都继承MvpPresenter。很显然这样V父类中的实现无法知晓该返回 
Pa或者Pb的对象,同样的MvpPresenter也只能对父类MvpView对象操作。

自然而然我们想到了泛型,在父类中添加泛型,在类被使用时再被告知该返回哪个子类。由下文代码找到P中需要为泛型是接口IViewA。 
而V需要泛型的为Presenter类。

public class MvpViewA implements IViewA {private MvpPresenter presenter;public void onCreate(){presenter = new MvpPresenter();presenter.attachView(this);}public void onDestroy(){presenter.detachView();}public void doSomeInV(){}
}

public class MvpPresenter {private WeakReference<IViewA> viewRef;public void attachView(IViewA view) {viewRef = new WeakReference<>(view);}public void detachView() {if (viewRef != null) {viewRef.clear();viewRef = null;}}public void doSomeInP(){viewRef.doSomeInView()}
}

变为


public abstract class MvpBasePresenter<V extends IMvpView> implements MvpPresenter<V> {private WeakReference<V> viewRef;@Overridepublic void attachView(V view) {viewRef = new WeakReference<V>(view);}protected V getView() {return viewRef.get();}@Overridepublic void detachView() {if (viewRef != null) {viewRef.clear();viewRef = null;}}
}public abstract class MvpBaseView<P extends MvpPresenter> extends BaseView implements IMvpView {protected P presenter;protected abstract P createPresenter();protected void onCreate() {presenter = createPresenter();presenter.attachView(this);}protected void onDestroy() {presenter.detachView();}
}

 厉害了 解耦更成功了一步。

转载于:https://www.cnblogs.com/cold-ice/p/6836155.html

Android MVP框架实现过程相关推荐

  1. Android MVP框架学习

    什么是MVP框架 做Android开发也有好几年时间了,最近接触了Android开发的MVP模式,MVP即Model.View.Presenter的缩写.如果有过一些项目开发经验的人,在项目功能越来越 ...

  2. Android MVP框架MVPro的使用和源码分析

    最近看了两篇关于Android实现MVP的文章一种在android中实现MVP模式的新思路和用MVP架构开发Android应用. 两篇文章的思路都是一样的,即把Activity.Fragment作为P ...

  3. android MVP框架

    尝试使用MVVM开发模式,让程序解耦. MVVM开发模式图: 优势 模型与视图完全分离,我们可以修改视图而不影响模型: 可以更高效地使用模型,因为所有的交互都发生在一个地方--Presenter内部: ...

  4. Android MVP 框架

    为什么80%的码农都做不了架构师?>>>    前言 根据网络上的MVP套路写了一个辣鸡MVP DEMO 用到的 android studio MVPHelper插件,方便自动生成框 ...

  5. android mvp框架基类,Android MVP架构项目搭建封装,基类封装

    综述 对于MVP (Model View Presenter)架构是从著名的MVC(Model View Controller)架构演变而来的.而对于Android应用的开发中本身可视为一种MVC架构 ...

  6. Android MVP框架搭建

    1. 自定义全局配置文件 创建全局自定义配置文件 config.gradle,拆分配置,便于依赖引用管理: 全局 build.gradle 引入自定义配置文件 2. 创建common module, ...

  7. Android MVP 详解(上)

    作者:李旺成 时间:2016年4月3日 "Android MVP 详解(下)"已经发布,欢迎大家提建议. MVP 在 Android 上的使用其实已经有挺长一段时间了,长到似乎有点 ...

  8. android 最新框架组合,android 官方mvp框架优化:lifecycle-mvp,像前端那样组合式写页面...

    目录 1 前言 虽然在标题上,自己很随意的起了这么一个名字.其实并不是说它起个英文名就牛逼了.说白了,它其实就是mvp的思想加了lifecycle-component,然后加入了分层的思想,最后用Ty ...

  9. Android 天气APP(四)搭建MVP框架与使用

    上一篇:Android 天气APP(三)访问天气API与数据请求 MVP/MVVM框架搭建与使用 新版------------------- 一.创建依赖模块 二.模块初始化 三.搭建网络框架 四.基 ...

最新文章

  1. bzoj 2724[Violet 6]蒲公英
  2. linux oracle 数据库导出
  3. everythingtoolbar.dll”或它的一个依赖项。_ASP.NET Core依赖注入最佳实践、提示和技巧...
  4. 从零写一个编译器(二):语法分析之前置知识
  5. 玩转CSS选择器(一) 之 使用方法介绍
  6. P3768 简单的数学题 [狄利克雷卷积,杜教筛,莫比乌斯反演]
  7. 基础算法 —— 高精度计算 —— Java 大数类
  8. I/O Permission Bit Map in Task State Segment(TSS)
  9. Ajax(从json中提取数据)
  10. bootstrap table border粗细_Web前端开发(18)——Bootstrap响应式布局
  11. Lyft Level 5 Challenge 2018 - Elimination Round题解【待补】
  12. 玩转spring boot——结合jQuery和AngularJs
  13. C语言排序(冒泡排序、选择排序、插入排序和快速排序)
  14. 你越来越孤独的3个原因
  15. 从一文中了解SSRF的各种绕过姿势及攻击思路
  16. consistent equation
  17. 【Autosar Can网络远程唤醒】
  18. 微信新出“一键拒收”功能!公众号主怎么办?
  19. 蜂窝通信模组,是物联网终端的核心组件之一
  20. 基于ant-design-vue的简易农历日历

热门文章

  1. hibernate 多对多注解配置
  2. Linux 网络服务之FTP 文件传输
  3. 本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/jinjazz/archive/2009/04/29/4138000.aspx...
  4. C-free在编写代码的过程中遇到方向键失灵,回车键失灵,换行失灵,但是可以正常输入的解决办法!!!!!
  5. 素数和 mooc 翁恺
  6. 问题 J: A+B Problem (II) : Input/Output Practice 山东科技大学OJ C语言
  7. c 语言 二维数组地址,C/C++ 关于一维或二维数组首地址表示含义
  8. float类型转integer_【第3章:Java基础程序设计】_Java数据类型
  9. php 替换指定标签中的内容,php如何根据不同的条件替换html代码中的img标签
  10. SAP License:解释一下目标成本、计划成本和标准成本的区别