Handler 引起的内存泄露
先看一组简单的代码
1 |
public class SampleActivity extends Activity { private final Handler mHandler = new Handler() { |
当我们这样写在一个Activity
中时,Android Lint
会提示我们这样一个 warning: In Android, Handler classes should be static or leaks might occur.
。
意思说:在Android中,Handler 类应该是静态的否则可能发生泄漏。
为什么会是这样呢?
了解一下Handler
- 当Android程序第一次创建的时候,在主线程同时会创建一个
Looper
对象。Looper
实现了一个简单的消息队列,一个接着一个处理Message
对象。程序框架所有主要的事件(例如:屏幕上的点击时间,Activity
生命周期的方法等等)都包含在Message
对象中,然后添加到Looper
的消息队列中,一个一个处理。主线程的Looper
存在整个应用程序的生命周期内。 - 当一个
Handler
对象在主线程中创建的时候,它会关联到Looper
的 message queue 。Message
添加到消息队列中的时候Message
会持有当前Handler
引用,当Looper
处理到当前消息的时候,会调用Handler#handleMessage(Message)
. - 在
java
中,no-static
的内部类会 隐式的 持有当前类的一个引用。static
的类则没有。
在什么地方引起了内存的泄露呢?再看看下面一段代码
1 |
public class SampleActivity extends Activity { private final Handler mHandler = new Handler() { |
当Activity
结束后,在 Message queue 处理这个Message
之前,它会持续存活着。这个Message
持有Handler
的引用,而Handler
有持有Activity
(SampleActivity)的引用,这个Activity
所有的资源,在这个消息处理之前都不能也不会被回收,所以发生了内存泄露。
解决办法,看下面一段代码
1 |
public class SampleActivity extends Activity { /** |
ok,结束
NOTE: 好多人有担心弱引用的Activity
回收的情况,这个完全不用担心的,因为我们在这个界面的时候,这个Activity
是不会被回收的,想想 如果我们的这个Activity被回收了,我们的这个界面是怎么存在的呢?
NOTE2: 各位,我是参照AsyncTask
,查看文档和自己的理解,存在我解释不了的地方,还望见谅,如有错误还望见谅。
原文作者: 花_开_堪_折_枝
Handler 引起的内存泄露的更多相关文章
- Android handler 可能会造成内存泄露
Android handler 可能会造成内存泄露 Android Studio 使用 Handler 时: private Handler handler = new Handler(){ @Ove ...
- Android 中 Handler 引起的内存泄露
在Android常用编程中,Handler在进行异步操作并处理返回结果时经常被使用.其实这可能导致内存泄露,代码中哪里可能导致内存泄露,又是如何导致内存泄露的呢?那我们就慢慢分析一下.http://w ...
- 【转】内部Handler类引起内存泄露
如果您在Activity中定义了一个内部Handler类,如下代码: public class MainActivity extends Activity { private Handl ...
- Android 从java字节码告诉你 为什么Handler会造成内存泄露
很多人面试的时候,都知道Handler 极易造成内存泄露,但是有一些讲不出来为什么,好一点的 会告诉你looper msg 之类的,但是你再往下问 为什么msg持有handler handler为什么 ...
- Android中Handler引起的内存泄露
在Android常用编程中,Handler在进行异步操作并处理返回结果时经常被使用.通常我们的代码会这样实现. 1 2 3 4 5 6 7 8 9 public class SampleActivit ...
- Handler引起的内存泄露
一般我都写handler的时候是这样的: public class MyActivity extends Activity{ private final Handler myHandler = n ...
- Android中Handler导致的内存泄露
http://www.androiddesignpatterns.com/2013/01/inner-class-handler-memory-leak.html Consider the follo ...
- Android性能优化——之防止内存泄露
又是好久没有写博客了,一直都比较忙,最近终于有时间沉淀和整理一下最近学到和解决的一些问题. 最近进行技术支持的时候,遇到了几个崩溃的问题,都是OOM异常,一般OOM异常给人的感觉应该是加载大图片造成的 ...
- Android之内存泄露、内存溢出、内存抖动分析
内存 JAVA是在JVM所虚拟出的内存环境中运行的,内存分为三个区:堆.栈和方法区.栈(stack):是简单的数据结构,程序运行时系统自动分配,使用完毕后自动释放.优点:速度快.堆(heap) ...
随机推荐
- [整理]Svn常见问题汇总。
1.’.’ is not a working copy.Can’t open file‘.svn/entries’: 系统找不到指定的路径. 解答:原因是输入的访问路径不正确,如svn://192.1 ...
- / etc / init.d / iptables: line 268: restorecon: command not found
When I tried to restart iptables from vps , I got the following error. Iptables encountered such a p ...
- ant非法字符:\65279 错误
ant非法字符:\65279 错误前段时间用ant把项目打包,遇到一个问题:编译java文件的时候,有些java文件报非法字符 \65279错误,在网上找和很多方法,也试了很多方法,换JDK,网上说的 ...
- [转]使用CSS3实现树形控件
下面是一个使用HTML的ul标签制作的关于国家区划的组织结构图. 中国 北京 广东省 广州市 韶关市 海南省 海口市 美兰区 龙华区 秀英区 琼山区 三亚市 安徽省 合肥市 安庆市 United St ...
- 2014北邮新生归来赛解题报告d-e
D: 399. Who Is Joyful 时间限制 3000 ms 内存限制 65536 KB 题目描述 There are several little buddies standing in a ...
- ASP.NET MVC 4使用Bundle的打包压缩JS/CSS
打包(Bundling)及压缩(Minification)指的是将多个js文件或css文件打包成单一文件并压缩的做法,如此可减少浏览器需下载多个文件案才能完成网页显示的延迟感,同时通过移除JS/CSS ...
- K2十年:专注BPM
<聚·谋·变——K2中国用户大会> 导演:K2中国 主演:K2用户 时长:420分钟 票价:免费 上映日期:2015年7月17日 查看完整视频请关注K2官方微信账号
- sql 给数据库表 字段 添加注释
最近发现一些代码生成器 有针对注释做一个很好的转化,之前建表的时候 没有这块的注释.现在想增加,专门去看了下 如何增加注释 1 -- 表加注释 2 EXEC sys.sp_addextendedpro ...
- vs2013的使用和单元测试
我的vs2013是之前就安装好的,安装过程就不介绍了,我平常编写代码就是用的vs2013,用起来还是很方便的,现在我们就开始使用vs2013进行单元测试 首先我们建立一个项目,项目中选择virtual ...
- C语言与MATLAB接口 编程与实例 李传军编着
罗列一下以前自己学习C语言与MATLAB混编的笔记,顺便复习一遍. <C语言与MATLAB接口 编程与实例 李传军编着>(未看完,目前看到P106) 目录P4-8 ************ ...