最近项目马上结束了在对项目进行检查有没有内存泄漏的地方,这里使用的是leakcanary。

使用步骤很简单:

添加依赖:

dependencies { debugCompile 'com.squareup.leakcanary:leakcanary-android:1.4-beta2' releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.4-beta2' testCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.4-beta2' }

配置Application

@Override

public void onCreate() {

super.onCreate();

LeakCanary.install(this);

}}```

这是github上的网址:https://github.com/square/leakcanary

下面是检测出来的结果。![这里写图片描述](http://upload-images.jianshu.io/upload_images/1711057-6570c583e431052f?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

这是一个提醒框,提醒用户正在加载中。仔细查看了下代码能导致内存溢出的只有这一行代码。

``` public LoadingDialog getDialog(String info) {

Builder b = new Builder(mContext);

b.setInfo(info);

dialog = b.create();

dialog.show();

UIUtils.postDelayed(new Runnable() {

@Override

public void run() {

if (dialog.isShowing()) {

dialog.dismiss();

MlsApplication.showToast("操作超时,请稍后再试"); } } }, 10000);

return dialog; }```

这里是调用的Handler中的postDelayed()方法延时执行某个动作。这里有这样一层关系Dialog创建时的参数有Activity的Context所以dialog中有context的引用,又因为handler持有外部类的引用,为什么持有呢?

摘抄一段话:

1. 当一个Android应用启动时,框架会分配到一个Looper实例给应用的主线程。这个Looper的主要工作就是处理一个接着一个的消息对象。在Android中,所有Android框架的事件(比如Activity的生命周期方法的调用和按钮的点击等)都是放到消息中,然后加入到Looper要处理的消息队列中,由Looper依次处理。主线程的Looper的生命周期和应用的一样长。

2. 当在主线程中初始化一个Handler时,它就会关联到Looper的消息队列。发送到消息队列的消息本身就持有Handler的引用,只有这样Looper在处理这个条消息的时候才能调用Handler#handleMessage(Message)处理消息。

3. 在Java中,非静态的内部类和匿名内部类都会隐式地持有其外部类的引用。而静态的内部类则不会。

链接:http://johnnyshieh.github.io/android/2015/09/03/android-handler-memory-leak/

其中runnable使用的是匿名内部类也持有外部类的引用,这就引发了一个问题当Activity finish的时候因为还有其他类对Activity持有引用就不会导致Activity从内存中销毁最后就会引发内存泄漏。下面是解决办法:因为静态类是不会持有外部类的引用,但是会有一个问题?怎么在静态内部类中使用外部类的变量呢?这里就要使用弱引用WeakReference.

1.首先创建一个静态的handler

``` private static class MyHandler extends Handler {

private final WeakReference mActivity;

private MyHandler(Context mActivity) {

this.mActivity = new WeakReference(mActivity);

}

}```

2.创建一个静态的Runnable

``` private static final class WeakRunnable implements Runnable {

private WeakReference dialog;

public WeakRunnable(Dialog dialog) {

this.dialog =new WeakReference < Dialog > (dialog);

}

@Override

public void run() {

Dialog dialog = this.dialog.get();

if (null != dialog && dialog.isShowing()) {

dialog.dismiss(); } } }```

3.修改调用

``` handler.postDelayed(new WeakRunnable(dialog), 100000);```

这样在重新运行程序连续切换界面旋转屏幕都不会出现内存泄漏了。

android 内存溢出检查,Android Handler使用导致内存溢出附带LeakCanary排查相关推荐

  1. android的内存泄露有几种,Android中几种有可能会导致内存泄露的情况

    8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? 1.Static静态成员导致的内存泄露 将占用大量内存空间的变量声明为static静态类型.当Activity被销毁的时 ...

  2. 7 php 内存泄漏_php 大数组导致内存泄露问题

    错误提示: Fatal error:  Allowed memory size of 134217728 bytes exhausted (tried to allocate 72 bytes) in ...

  3. 什么是内存溢出与内存泄露,几种常见导致内存泄露的写法

    最近朋友推荐了一篇关于内存溢出与内存泄漏的文章,感觉写的还不错,于是便在网上搜索了一番,对这块进行了加固,发现自己之前写的代码也存在一些内存泄漏的风险,所以弄懂内存泄漏与内存溢出是很有利于我们提高代码 ...

  4. Android学习笔记:Handler

    一.Handler简介 Handler是Android消息机制的上层接口,这使得在开发过程中只需要和Handler交互即可.Handler的使用过程很简单,通过它可以轻松的将一个任务转换到Handle ...

  5. Android开发之Android性能优化记录

    Android 性能优化 Android 中的性能优化在我看来分为以下几个方面:内存优化.布局优化.网络优化.安装包优化: 内存优化: 下一个问题就是: 布局优化: 布局优化的本质就是减少 View ...

  6. Android 面试(Android 篇)

    Android 面试 安卓篇 一.跨进程通信的几种方式 二.多进程应用使用场景 三.Binder 机制 (进程间的通信) 四.说一说 ANR 五.什么是OOM,如何避免解决 六.内存泄露,内存溢出,内 ...

  7. jvm内存溢出区域和排查方法

    目录 1.堆溢出 2.栈溢出 3.方法区和运行时常量池溢出 4.本机直接内存溢出 首先我们需要掌握什么是内存溢出和内存泄漏 内存泄漏:即声明的对象无法被回收,一直存在于内存中,使得占用的内存就像被泄漏 ...

  8. android开发中,可能会导致内存泄露的问题

    转自 : http://spencer-dev.lofter.com/post/d7b9e_6faf120 在android编码中,会有一些简便的写法和编码习惯,会导致我们的代码有很多内存泄露的问题. ...

  9. Android开发-Handler引起的内存泄漏-实验、分析、总结。

    介绍 最近在恶补Handler的知识,其中就涉及到了Handler引起的内存泄露问题,网络上有很多的分析文章.我就按照这些文章的思路,写代码验证,主要是验证和记录.  使用的内存检测工具是:LeakC ...

最新文章

  1. 用流收集数据Collectors的用法介绍分组groupingBy、分区partitioningBy(一)
  2. Project Server 2003配置部署指南_百度文库
  3. matlab标定工具箱 参数,使用MATLAB标定工具箱求出内外参数后怎样求实物的两点间......
  4. python比较文件每行长度_读取文件并查找所有行的长度是否相同
  5. 的udp的接收端如何看速率_计算机网络 TCP与UDP
  6. random number in groovy
  7. python编程入门视频-带学《Python编程:从入门到实践》
  8. 可配置语法分析器开发纪事(二)——构造符号表
  9. OpenCV颜色空间——HLS颜色空间
  10. html css js介绍ppt,HTML+CSS+JS-入门基础.ppt
  11. idea 离线安装 idea json view 插件
  12. jspSmartUpload.jar包
  13. android 打印机 万能驱动,打印机驱动,万能打印机驱动下载,驱动程序_万能驱动下载...
  14. 使用Nginx实现多重流量复制
  15. 求一个好用的简洁设置的PPT倒计时器
  16. 固态硬盘比机器硬盘好很多吗?
  17. 【教程】应用侧连接华为云IoT平台
  18. 计算机word知识试题及答案,计算机二级考试word试题及答案
  19. C语言实现3个数的最小公倍数和最大公约数
  20. sockaddr_in和sockaddr区别

热门文章

  1. Facebook 面向个性化推荐系统的深度学习推荐模型
  2. cmake命令的python库的位置参数-DTORCH_PATH
  3. 今晚7点,腾讯专家详解腾讯广告召回系统的演进
  4. 赛道一双周冠军分享:我不是TFboy,所以新写了baseline
  5. 【算法大赛直播周】隐私保护与精准营销亦能兼得,“联邦广告”如何打破数据孤岛?
  6. 预训练新范式!为什么Prompt会更有效?
  7. 机器学习-吴恩达-笔记-15-总结
  8. 机器学习-吴恩达-笔记-6-应用机器学习的建议
  9. Flutter 入门指北(Part 9)之弹窗和提示(SnackBar、BottomSheet、Dialog)
  10. python自定义一个可迭代类_python进阶之自定义可迭代的类