Android handler.removeCallbacksAndMessages(null)的妙用

问题

在Android项目中,Handler通常被用作主线程和子线程之间的通信。在实际应用过程中,我们经常通过Hander发送Message或者Runnable到主线程,但却很少主动在UI(Activity/Fragment)销毁时,进行移除Message或者Runnable操作,造成的后果可能是内存泄露,空指针。。。

解决方案

参考网上的做法,这里建议在基础UI类(BaseActitivy/BaseFragment)的onDestory函数中,调用以下函数,自动移除Message或者Runnable。

···java
private void releaseHandlers(){
try {
Class<?> clazz = getClass();
Field[] fields = clazz.getDeclaredFields();
if (fields == null || fields.length <= 0 ){
return;
}

  for (Field field: fields){
     field.setAccessible(true);
     if(!Handler.class.isAssignableFrom(field.getType())) continue;

           Handler handler = (Handler)field.get(this);
           if (handler != null && handler.getLooper() == Looper.getMainLooper()){
              handler.removeCallbacksAndMessages(null);
           }
     field.setAccessible(false);
  }

} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
···

注: 这里只是针对当前类进行处理。如果需要处理父类,则还需要一层遍历。

优缺点

优点

在基础UI类中统一修改,改动小,作用大。

缺点

影响范围大。只是用于Hander被用作主线程和子线程之间通信的场景。
如果Hander被创建在主线程,却被有意用在UI销毁后仍然能够执行的场景下,不适合使用这种方法。

欢迎讨论。

参考文档:

  1. http://blog.csdn.net/ouyang_peng/article/details/16801497
  2. http://stackoverflow.com/questions/5883635/how-to-remove-all-callback-from-a-handler/10145615#10145615
时间: 2024-10-30 07:03:58

Android handler.removeCallbacksAndMessages(null)的妙用的相关文章

android中Handler.removeCallbacksAndMessages(null)的作用

今天都到一段代码,在onDestroy()方法中,使用了下面的代码: mHandler.removeCallbacksAndMessages(null);   一开始我完全看不懂,我为什么参数是null,如果是null还需要移除什么Callbacks和Messages.后来察看官方文档有以下说明: 地址:http://developer.android.com/reference/android/os/Handler.html#removeCallbacksAndMessages%28java.

我的Android进阶之旅------&amp;gt;Handlerr.removeCallbacksAndMessages(null)的作用

  今天都到一段代码,在onDestroy()方法中,使用了下面的代码: mHandler.removeCallbacksAndMessages(null);   一开始我完全看不懂,我为什么参数是null,如果是null还需要移除什么Callbacks和Messages.后来察看官方文档有以下说明: 地址:http://developer.android.com/reference/android/os/Handler.html#removeCallbacksAndMessages%28jav

深入Android Handler与线程间通信ITC的详解_Android

在<Android Handler之消息循环的深入解析>中谈到了Handler是用于操作线程内部的消息队列,所以Handler可以用来线程间通信ITC,这种方式更加安全和高效,可以大大减少同步的烦恼,甚至都可以不用syncrhonized.线程间通讯ITC正常情况下函数调用栈都会生存在同一个线程内,想要把执行逻辑交换到其他线程可以新建一个Thread,然后start().另外一种方法就是用ITC,也即用消息队列来实现,线程需要把执行逻辑交到其他线程时就向另外的线程的消息队列发送一个消息,发送消

Android Handler多线程详解_Android

Android--多线程之Handler 前言 Android的消息传递机制是另外一种形式的"事件处理",这种机制主要是为了解决Android应用中多线程的问题,在Android中不 允许Activity新启动的线程访问该Activity里的UI组件,这样会导致新启动的线程无法改变UI组件的属性值.但实际开发中,很多地方需要在 工作线程中改变UI组件的属性值,比如下载网络图片.动画等等.本篇博客主要介绍Handler是如何发送与处理线程上传递来的消息,并讲解 Message的几种传递数

Android handler 详解(面试必问)_Android

handler在Android中被称为"消息处理者",在多线程中比较常用. Handler为Android提供了一种异步消息处理机制,当向消息队列中发送消息 (sendMessage)后就立即返回,而从消息队列中读取消息时会阻塞,其中从消息队列中读取消息时会执行Handler中的public void handleMessage(Message msg) 方法,因此在创建Handler时应该使用匿名内部类重写该方法,在该方法中写上读取到消息后的操作,使用Handler的 obtainM

Android Handler消息派发机制源码分析_Android

注:这里只是说一下sendmessage的一个过程,post就类似的 如果我们需要发送消息,会调用sendMessage方法 public final boolean sendMessage(Message msg) { return sendMessageDelayed(msg, 0); } 这个方法会调用如下的这个方法  public final boolean sendMessageDelayed(Message msg, long delayMillis) { if (delayMill

深入Android Handler与线程间通信ITC的详解

在<Android Handler之消息循环的深入解析>中谈到了Handler是用于操作线程内部的消息队列,所以Handler可以用来线程间通信ITC,这种方式更加安全和高效,可以大大减少同步的烦恼,甚至都可以不用syncrhonized. 线程间通讯ITC 正常情况下函数调用栈都会生存在同一个线程内,想要把执行逻辑交换到其他线程可以新建一个Thread,然后start().另外一种方法就是用ITC,也即用消息队列来实现,线程需要把执行逻辑交到其他线程时就向另外的线程的消息队列发送一个消息,发

Android handler 详解(面试必问)

handler在Android中被称为"消息处理者",在多线程中比较常用. Handler为Android提供了一种异步消息处理机制,当向消息队列中发送消息 (sendMessage)后就立即返回,而从消息队列中读取消息时会阻塞,其中从消息队列中读取消息时会执行Handler中的public void handleMessage(Message msg) 方法,因此在创建Handler时应该使用匿名内部类重写该方法,在该方法中写上读取到消息后的操作,使用Handler的 obtainM

Android Handler 原理分析及实例代码

Android Handler 原理分析 Handler一个让无数android开发者头疼的东西,希望我今天这边文章能为您彻底根治这个问题 今天就为大家详细剖析下Handler的原理 Handler使用的原因 1.多线程更新Ui会导致UI界面错乱 2.如果加锁会导致性能下降 3.只在主线程去更新UI,轮询处理 Handler使用简介 其实关键方法就2个一个sendMessage,用来接收消息 另一个是handleMessage,用来处理接收到的消息 下面是我参考疯狂android讲义,写的一个子