MVP简介

M-Modle,数据,逻辑操作层,数据获取,数据持久化保存。比如网络操作,数据库操作

V-View,界面展示层,Android中的具体体现为Activity,Fragment

P-Presenter,中介者,连接Modle,View层,同时持有modle引用和view接口引用 

示例代码
Modle层操作

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class TestModle implements IModle{
  private CallbackListener callback;
  public TestModle(CallbackListener callback) {
    this.callback = callback;
  }
  public interface CallbackListener {
    void onGetData(String data);
  }
  public void getData() {
    new Thread() {
      public void run() {
        callback.onGetData("返回的数据");
      }
    }.start();
  }
}

View层

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
// 抽象的view层
public interface TestViewInterf extends IView {
  void onGetData(String data);
}
// 具体的View层
public class MainActivity extends Activity implements TestViewInterf{
  private TestPresenter mTestPresenter;
  @Override
  public void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // view层将获取数据的任务委派给中介者presenter,并传入自身实例对象,实现TestViewInterf接口
    mTestPresenter = new TestPresenter(this);
    mTestPresenter.getData();
  }
  @Override
  public void onGetData(String data) {
    // View层只做数据展示
    showToast(data);
  }
  private void showToast(String toast) {
    Toast.makeText(this, toast, Toast.LENGTH_LONG).show();
  }
}

Presenter中介者

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class TestPresenter implements IPresenter{
  IModle modle;
  IView view;
  public TestPresenter(IView view) {
    this.view = view;
  }
  public void getData() {
    // 获取数据的操作实际在Modle层执行
    modle = new TestModle(new CallbackListener() {
      public void onGetData(String data) {
        if (view != null) {
          view.onGetData(data);
        }
      }
    });
    modle.getData();
  }
}

根据OOP思想,Java应面向接口编程,这样才能给符合OCP原则。上述示例代码省略了更加抽象的接口IModle,IView,IPresenter,并且实际MVP实践中通常会引入泛型使其更具扩展性。

Google已提供了相关示例代码,并在MVP中增加了一个约束者:Contract,它的作用是定义各个模块的MVP接口。 
google MVP sample code:https://github.com/googlesamples/android-architecture

内存泄露问题

由上可见,Presenter中持有View接口对象,这个接口对象实际为MainActivity.this,Modle中也同时拥有Presenter对象实例,当MainActivity要销毁时,Presenter中有Modle在获取数据,那么问题来了,这个Activity还能正常销毁吗?

答案是不能!

当Modle在获取数据时,不做处理,它就一直持有Presenter对象,而Presenter对象又持有Activity对象,这条GC链不剪断,Activity就无法被完整回收。

换句话说:Presenter不销毁,Activity就无法正常被回收。

解决MVP的内存泄露

Presenter在Activity的onDestroy方法回调时执行资源释放操作,或者在Presenter引用View对象时使用更加容易回收的软引用,弱应用。

比如示例代码: 
Activity

?
1
2
3
4
5
@Override
  public void onDestroy() {
    super.onDestroy();
    mPresenter.destroy();
  }

Presenter

?
1
2
3
4
5
6
public void destroy() {
  view = null;
  if(modle != null) {
    modle.cancleTasks();
  }
}

Modle

?
1
2
3
public void cancleTasks() {
  // TODO 终止线程池ThreadPool.shutDown(),AsyncTask.cancle(),或者调用框架的取消任务api
}

个人总结

因为面向MVP接口编程,可适应需求变更,所以MVP适用于比较大的项目;因为其简化了Activity和Fragmnt的职责,可大大减少View层的代码量,比起MVC中Activity,Fragment动不动上千行的代码量,简直优雅!

做完以上操作,由于MVP引起的内存泄露就差不多解决了,以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

android MVP 模式内存泄漏如何解决相关推荐

  1. 使用 Android Studio 检测内存泄漏与解决内存泄漏问题

    本文在腾讯技术推文上 修改 发布. http://wetest.qq.com/lab/view/63.html?from=ads_test2_qqtips&sessionUserType=BF ...

  2. Android 常见内存泄漏及解决方法

    Android中的内存泄漏: 先说一下为什么会出现内存泄漏: Android程序开发中,如果一个对象已经不需要被使用了,本该被回收时,而这时另一个对象还在持有对该对象的引用,这样就会导致无法被GC回收 ...

  3. android 内存泄漏分析工具,Android内存泄漏终极解决篇(上)

    一.概述 在Android的开发中,经常听到"内存泄漏"这个词."内存泄漏"就是一个对象已经不需要再使用了,但是因为其它的对象持有该对象的引用,导致它的内存不能 ...

  4. Android之内存泄漏以及解决办法(持更)

    Android之内存泄漏以及解决办法 文章链接:http://blog.csdn.net/qq_16628781/article/details/67761590 知识点: 单例造成的内存泄漏原因和解 ...

  5. Android性能优化之利用强大的LeakCanary检测内存泄漏及解决办法

    本篇文章主要介绍了Android性能优化之利用LeakCanary检测内存泄漏及解决办法,有兴趣的同学可以了解一下. 目录 前言 什么是内存泄漏? 内存泄漏造成什么影响? 什么是LeakCanary? ...

  6. android mvp模式例子_ANDROID MVP 模式 简单易懂的介绍方式

    Android MVP Pattern Android MVP 模式1 也不是什么新鲜的东西了,我在自己的项目里也普遍地使用了这个设计模式.当项目越来越庞大.复杂,参与的研发人员越来越多的时候,MVP ...

  7. Android MVP模式 解析JSON 显示到ListView上

    Android MVP模式 解析JSON 显示到ListView上 有关MVP模式的介绍,这里不作详细解释,稍后会更新MVP设计模式,请等待链接-- 简述本次的主要功能实现: 通过mvp设计模式,(M ...

  8. 关于Android应用程序内存泄漏 你需要知道的一切

    关于Android应用程序内存泄漏 你需要知道的一切 原文:https://blog.aritraroy.in/everything-you-need-to-know-about-memory-lea ...

  9. Android中的内存泄漏

    ** Android中的内存泄漏 ** Android中的内存泄漏: 概念:程序在申请内存后,当该内存不需再使用但却无法被释放 & 归还给程序的现象,对应用程序的影响,容易使得应用程序发生内存 ...

最新文章

  1. shell实例第14讲:字符串截取的8种方法
  2. 自己动手写事件总线(EventBus)
  3. 选择嵌套_还不会if函数的嵌套判断,学会这方法,就跟复制粘贴一样简单
  4. Android笔记 theme主题
  5. 电商BANNER灵感背景欣赏|平面设计中的极简风格
  6. web前端:技术提升必学的HTML用法
  7. 一小时做出Java实战项目——飞翔的小鸟
  8. error LNK2005
  9. TPC,TPCC,TPMC(数据库性能衡量指标)
  10. Dracoo Master天龙卡牌大师
  11. 【四二学堂】H5手机游戏-梅花易数一撮金(游戏开发系列微课之一)
  12. 声纹技术(三):声纹识别技术
  13. 亚马逊显示在售商品为0怎么办?亚马逊新品货还没到就在售了
  14. Linux scp和sftp
  15. 计算机应用说课稿,中职计算机说课稿
  16. ChromeOptions--禁止加载图片
  17. shell 计算磁盘使用率
  18. Session | web应用的session机制、session的实现原理
  19. char/nchar、varchar/nvarchar、char/character区别
  20. Redis是什么?Redis有哪些数据类型?Redis怎么集群?

热门文章

  1. xp 安装mysql数据库_Windows XP系统中安装MySQL5.5.28数据库图文教程
  2. python select模块安装_python+selenium select下拉选择框定位处理方法
  3. java 文件引用路径_JAVA项目引用文件路径问题
  4. CUDA简易安装教程
  5. opencv图像操作:读取,裁剪,保存,缩放,遍历和读取文件夹图片
  6. 进程、线程、多线程、并发、并行学习记录
  7. mqtt 串口_MQTT网关介绍及应用原理
  8. 发动机异响故障诊断与排除_发动机缺缸故障诊断以及排除方法
  9. 使用jenkins自动化打包部署Vue项目。详细教程。
  10. Office 365和SFB更新