解决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的弱引用。

相关文章推荐

使用kotlin编写Android第一个Activity

本文主要是通过使用kotlin,来编写关于android的第一个Activity!在Activity中,我们实现以下几个功能: 1。获取布局文件中的TextView 2。代码修改TextView的...

kotlin 之 Handler 与 Thread

handler 与Thread 的组合在程序中应用很广,在此稍微记录一下: 首先先创建 一个thread 与 handler: private var thread :Thread? = nul...

Android CrashHandler编写自己的异常捕获类

平时写代码,我们可能会抛出各种异常,这些异常有些是我们测试过程中发现进行解决的,但是也有一些异常是我们未知的,不论是代码的逻辑问题还是Android本身底层的一些bug,我们都需要及时了解并进行解决。...

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

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

使用runOnUiThread解决Handler无法调用含用子线程方法的问题

Handler和runOnUIThread都是子线程操作UI线程界面元素的方案,之前一直以为runOnUIThread能做到的Handler也能做,但是今天发现了一个问题,只能用runOnUIThre...

使用软引用解决Handler内存泄露和显示Popupwindow、Dialog时提示"Unable to add Window-token is null"的问题

通过软引用解决Handler内存泄露的问题  下面对软引用使用的方式适用于任何内部类,严格来说是通过软引用解决静态内部类无法调用当前类中的对象和方法的问题,真正解决内存泄露是需要将内部类改成静态内部类...
  • zmywly
  • zmywly
  • 2015年09月22日 21:03
  • 958

关于handler在子线程中无法给activity传递信息的问题及解决办法

遇到一个问题,我在与服务器交互信息时,开启了另一个线程,并未这个线程(子线程)传入了handler,得到服务器返回的结果后,我开启了Looper,然后调用handler.sendMessage()想把...

基于Android中Looper , Handler , Message的线程池,轻松解决Sqlite数据库的线程安全问题

基于Looper , Handler , Message的线程池,主要思路和其它线程池没有什么两样,重点是当分配任务到线程池中执行时,可以通过id指定在哪个线程运行,这就可以很好的解决上面提到的Sql...

Handler经典使用方法中的内存泄漏问题的解决方案

Handler的经典用法里,Handler对象作为成员变量被UI界面(Activity, Fragment...)引用,所以只要工作线程里有Handler的引用或者主线程的Looper里有messag...

ListView 异步更新出现问题的解决(Handler)

忙了一天,终于把问题给解决了,描述一下过程。要完成的功能是Activity中有一个ListView(itemsListView),通过开启一个线程来读取数据库中的联系人列表,ListView通过自定义...
  • DJY1992
  • DJY1992
  • 2013年06月14日 11:02
  • 844
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:解决handler警告问题
举报原因:
原因补充:

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