Chinaunix首页 | 论坛 | 博客
  • 博客访问: 397022
  • 博文数量: 78
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 940
  • 用 户 组: 普通用户
  • 注册时间: 2013-08-25 09:39
文章分类

全部博文(78)

文章存档

2016年(7)

2015年(1)

2014年(35)

2013年(35)

我的朋友

分类: Android平台

2014-11-24 16:07:00

使用Handler和AsyncTask一样,要注意匿名inner class对Activity的隐式引用而造成内存泄漏,所以使用的时候要记得清理。解决方法是使用对使用的Activity中的View对象用Weak Reference,并处理当View对象为null的情况。

点击(此处)折叠或打开

  1. private Handler mHandler = new Handler() {
  2.     @Override
  3.     public void handleMessage(Message msg) {
  4.         // ...
  5.     }
  6. };
如上写法示有可能出现内存泄漏:当一个Handler对象在主线程中创建的时候,它会关联到Looper的MessageQueue。Message添加到消息队列中的时候Message会持有当前Handler引用,当Looper处理到当前消息的时候,会调用Handler的handleMessage(Message);在java中,非static的内部类会隐式的持有当前类的一个引用,static的类则没有。由于非静态内部类Handler会持有外部类对象的引用,而Handler又由于Message处理的方式有可能常驻内存当中。这样就会导致外部的Activity或者Service在销毁之后无法及时被GC回收,甚至内存泄漏。为了避免泄露这个外部类,应该将Handler声明为static嵌套类,并且使用对外部类的弱应用。

点击(此处)折叠或打开

  1. static class MsgHandler extends Handler {
  2.     private WeakReference<Activity> mActivity;
  3.   
  4.     MsgHandler(Activity activity) {
  5.         mActivity = new WeakReference<Activity>(activity);
  6.     }
  7.     @Override
  8.     public void handleMessage(Message msg) {
  9.         Activity activity = mActivity.get();
  10.         if (activity != null) {
  11.             activity.handleMessage(msg);
  12.         }
  13.     }
  14. }
  15. private Handler mHandler = new MsgHandler(this);

阅读(1489) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~