Android handler.removeCallbacksAndMessages(null)的妙用

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

问题

在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
相关文章
|
6月前
|
存储 Android开发
Android 高版本 packageManager.getPackageArchiveInfo 总是返回null
Android 高版本 packageManager.getPackageArchiveInfo 总是返回null
264 1
NullPointerException:method 'android.content.BroadcastReceiver.onReceive' on a null object reference
NullPointerException:method 'android.content.BroadcastReceiver.onReceive' on a null object reference
|
Android开发 开发者
Android Studio 安装APK在虚拟机时报 Installation failed due to: 'null' 解决
Android Studio 安装APK在虚拟机时报 Installation failed due to: 'null' 解决
583 0
Android Studio 安装APK在虚拟机时报 Installation failed due to: 'null' 解决
|
Android开发
Android 踩坑记录,用.split()方法分割字符串返回null
Android 踩坑记录,用.split()方法分割字符串返回null
|
JSON Java Android开发
我的Android进阶之旅------&gt;解决Jackson等第三方转换Json的开发包在开启混淆后转换的实体类数据都是null的bug
1、错误描述 今天测试人员提了一个bug,说使用我们的app出现了闪退的bug,后来通过debug断点调试,发现我们的app转换服务器发送过来的json数据后,都是为null。
1517 0
|
JavaScript Java Android开发
Android修行手册之Kotlin-【Null检查】、【类型检查】、【区间】篇
众所周知,人生是一个漫长的流程,不断克服困难,不断反思前进的过程。在这个过程中会产生很多对于人生的质疑和思考,于是我决定将自己的思考,经验和故事全部分享出来,以此寻找共鸣!!!
252 0
|
JSON Android开发 图形学
修行Android Studio技巧到出神入化,快速涨薪-【预览列表】、【Null判断】篇
众所周知,人生是一个漫长的流程,不断克服困难,不断反思前进的过程。在这个过程中会产生很多对于人生的质疑和思考,于是我决定将自己的思考,经验和故事全部分享出来,以此寻找共鸣!!!
171 0
|
Android开发
Attempt to write to field &#39;android.support.v4.app.FragmentManagerImpl android.support.v4.app.Fragment.mFragmentManager&#39; on a null object refer
E/AndroidRuntime﹕ FATAL EXCEPTION: mainProcess: org.example.magnusluca.drawertestapp, PID: 3624java.lang.
1009 0