android 内存溢出检查,Android Handler使用导致内存溢出附带LeakCanary排查
最近项目马上结束了在对项目进行检查有没有内存泄漏的地方,这里使用的是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排查相关推荐
- android的内存泄露有几种,Android中几种有可能会导致内存泄露的情况
8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? 1.Static静态成员导致的内存泄露 将占用大量内存空间的变量声明为static静态类型.当Activity被销毁的时 ...
- 7 php 内存泄漏_php 大数组导致内存泄露问题
错误提示: Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 72 bytes) in ...
- 什么是内存溢出与内存泄露,几种常见导致内存泄露的写法
最近朋友推荐了一篇关于内存溢出与内存泄漏的文章,感觉写的还不错,于是便在网上搜索了一番,对这块进行了加固,发现自己之前写的代码也存在一些内存泄漏的风险,所以弄懂内存泄漏与内存溢出是很有利于我们提高代码 ...
- Android学习笔记:Handler
一.Handler简介 Handler是Android消息机制的上层接口,这使得在开发过程中只需要和Handler交互即可.Handler的使用过程很简单,通过它可以轻松的将一个任务转换到Handle ...
- Android开发之Android性能优化记录
Android 性能优化 Android 中的性能优化在我看来分为以下几个方面:内存优化.布局优化.网络优化.安装包优化: 内存优化: 下一个问题就是: 布局优化: 布局优化的本质就是减少 View ...
- Android 面试(Android 篇)
Android 面试 安卓篇 一.跨进程通信的几种方式 二.多进程应用使用场景 三.Binder 机制 (进程间的通信) 四.说一说 ANR 五.什么是OOM,如何避免解决 六.内存泄露,内存溢出,内 ...
- jvm内存溢出区域和排查方法
目录 1.堆溢出 2.栈溢出 3.方法区和运行时常量池溢出 4.本机直接内存溢出 首先我们需要掌握什么是内存溢出和内存泄漏 内存泄漏:即声明的对象无法被回收,一直存在于内存中,使得占用的内存就像被泄漏 ...
- android开发中,可能会导致内存泄露的问题
转自 : http://spencer-dev.lofter.com/post/d7b9e_6faf120 在android编码中,会有一些简便的写法和编码习惯,会导致我们的代码有很多内存泄露的问题. ...
- Android开发-Handler引起的内存泄漏-实验、分析、总结。
介绍 最近在恶补Handler的知识,其中就涉及到了Handler引起的内存泄露问题,网络上有很多的分析文章.我就按照这些文章的思路,写代码验证,主要是验证和记录. 使用的内存检测工具是:LeakC ...
最新文章
- 用流收集数据Collectors的用法介绍分组groupingBy、分区partitioningBy(一)
- Project Server 2003配置部署指南_百度文库
- matlab标定工具箱 参数,使用MATLAB标定工具箱求出内外参数后怎样求实物的两点间......
- python比较文件每行长度_读取文件并查找所有行的长度是否相同
- 的udp的接收端如何看速率_计算机网络 TCP与UDP
- random number in groovy
- python编程入门视频-带学《Python编程:从入门到实践》
- 可配置语法分析器开发纪事(二)——构造符号表
- OpenCV颜色空间——HLS颜色空间
- html css js介绍ppt,HTML+CSS+JS-入门基础.ppt
- idea 离线安装 idea json view 插件
- jspSmartUpload.jar包
- android 打印机 万能驱动,打印机驱动,万能打印机驱动下载,驱动程序_万能驱动下载...
- 使用Nginx实现多重流量复制
- 求一个好用的简洁设置的PPT倒计时器
- 固态硬盘比机器硬盘好很多吗?
- 【教程】应用侧连接华为云IoT平台
- 计算机word知识试题及答案,计算机二级考试word试题及答案
- C语言实现3个数的最小公倍数和最大公约数
- sockaddr_in和sockaddr区别
热门文章
- Facebook 面向个性化推荐系统的深度学习推荐模型
- cmake命令的python库的位置参数-DTORCH_PATH
- 今晚7点,腾讯专家详解腾讯广告召回系统的演进
- 赛道一双周冠军分享:我不是TFboy,所以新写了baseline
- 【算法大赛直播周】隐私保护与精准营销亦能兼得,“联邦广告”如何打破数据孤岛?
- 预训练新范式!为什么Prompt会更有效?
- 机器学习-吴恩达-笔记-15-总结
- 机器学习-吴恩达-笔记-6-应用机器学习的建议
- Flutter 入门指北(Part 9)之弹窗和提示(SnackBar、BottomSheet、Dialog)
- python自定义一个可迭代类_python进阶之自定义可迭代的类