解决handler警告问题

原创 2016年09月30日 09:13:09
1.子线程借着主线程里的Handler,发送一条消息到主线程。
2.这个消息会被主线程放入到消息队列里message queue
3.主线程里有一个轮询器looper,会发现消息队列里有一条消息,调用handler消息处理,执行handlermessage方法,去处理这个消息


当一个android主线程被创建的时候,同时会有一个Looper对象被创建,而这个Looper对象会实现一个MessageQueue(消息队列),当我们创建一个handler对象时,而handler的
作用就是放入和取出消息从这个消息队列中,每当我们通过handler将一个msg放入消息队列时,这个msg就会持有一个handler对象的引用。因此当Activity被结束后,这个msg在被取出来之前,这msg会继续存活,但是这个msg持有handler的引用,而handler在Activity中创建,会持有Activity的引用,
因而当Activity结束后,Activity对象并不能够被gc回收,因而出现内存泄漏。
这个根本原因就是:Activity在被结束之后,MessageQueue并不会随之被结束,如果这个消息队列中存在msg,则导致持有handler的引用,但是又由于Activity被结束了,msg无法被处理,从而导致永久持有handler对象,handler永久持有Activity对象,于是发生内存泄漏。但是为什么为static类型就
会解决这个问题呢?因为在java中所有非静态的对象都会持有当前类的强引用,而静态对象则只会持有当前类的弱引用。声明为静态后,handler将会持有一个Activity的弱引用,而弱引用会很容易被gc回收,这样就能解决Activity结束后,gc却无法回收的情况。(至于为什么强引用不能够被gc自动回收,而
弱引用对象为什么会被gc回收,可以自行去google)。


所以解决这个警告就有几种方法:
一:将hanlder对象声明为静态的对象。
二:使用静态内部类,通过WeakReference实现对Activity的弱引用。

Handler警告以及解决方法

在项目中使用Handler时,会出现警告提示,也会在Problems中进行统计和显示,如下图: 把鼠标放在,就会提示This Handler class should be static or le...
  • xue_wei_love
  • xue_wei_love
  • 2015年03月07日 15:14
  • 2124

AndroidStudio完美解决"Activity使用Handler时出现警告信息"的问题

handler 警告 1.静态内部类 2.对外部类采用弱引用方式.
  • nzfxx
  • nzfxx
  • 2016年07月07日 21:10
  • 1979

解决Android中Handler警告

1、Handler    在使用Handler时经常习惯性的写成如下形式,结果系统就会给出一种警告。This Handler class should be static or leaks migh...
  • longlyboyhe
  • longlyboyhe
  • 2015年09月30日 11:39
  • 1073

关于Handler Leak警告的正确处理方法

相信很多人都注意到了ADT版本更新之后出现的关于handler leak的警告: private Handler mHandler = new Handler() { @Override pu...
  • peceoqicka
  • peceoqicka
  • 2015年01月09日 16:20
  • 1363

Activity中定义Handler有警告

思考下面代码 1 public class SampleActivity extends Activity { 2 3 private final Handler mLeakyHand...
  • sxfda
  • sxfda
  • 2016年01月11日 11:27
  • 927

优雅地使用Handler,避免内存溢出、空指针

This Handler class should be static or leaks might occur (null) less... (Ctrl+F1) 在Activity中直接创建Han...
  • izera
  • izera
  • 2016年03月31日 11:26
  • 1462

Android之“Handler内部类引起的内存溢出警告”

在使用Handler异步操作并返回结果更新UI的时候,Android lint提示警告:This Handler class should be static or leaks might occur...
  • kingoneyun
  • kingoneyun
  • 2017年04月13日 15:47
  • 594

解决Android中Handler警告、…

原文地址:解决Android中Handler警告、SimpleDateFormat警告、"String".toUpperCase()警告作者:于任道1:Handler // This Handler ...
  • huanshiwushuang
  • huanshiwushuang
  • 2017年04月14日 15:16
  • 156

关于Android中使用Handler造成内存泄露的分析和解决

关于Android中使用Handler造成内存泄露的分析和解决 什么是内存泄露? Java使用有向图机制,通过GC自动检查内存中的对象(什么时候检查由虚拟机决定),如果GC发现一个或一组对象为不可到...
  • gao_chun
  • gao_chun
  • 2015年05月27日 15:03
  • 6995

解决Android中Handler警告、SimpleDateFormat警告、"String".toUpperCase()警告

1:Handler // This Handler class should be static or leaks might occur: IncomingHandler     @Suppre...
  • u012992171
  • u012992171
  • 2015年06月19日 12:57
  • 600
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:解决handler警告问题
举报原因:
原因补充:

(最多只允许输入30个字)