使用Handler和AsyncTask一样,要注意匿名inner class对Activity的隐式引用而造成内存泄漏,所以使用的时候要记得清理。解决方法是使用对使用的Activity中的View对象用Weak Reference,并处理当View对象为null的情况。
-
private Handler mHandler = new Handler() {
-
@Override
-
public void handleMessage(Message msg) {
-
// ...
-
}
-
};
如上写法示有可能出现内存泄漏:当一个Handler对象在主线程中创建的时候,它会关联到Looper的MessageQueue。Message添加到消息队列中的时候Message会持有当前Handler引用,当Looper处理到当前消息的时候,会调用Handler的handleMessage(Message);在java中,非static的内部类会隐式的持有当前类的一个引用,static的类则没有。由于非静态内部类Handler会持有外部类对象的引用,而Handler又由于Message处理的方式有可能常驻内存当中。这样就会导致外部的Activity或者Service在销毁之后无法及时被GC回收,甚至内存泄漏。为了避免泄露这个外部类,应该将Handler声明为static嵌套类,并且使用对外部类的弱应用。
-
static class MsgHandler extends Handler {
-
private WeakReference<Activity> mActivity;
-
-
MsgHandler(Activity activity) {
-
mActivity = new WeakReference<Activity>(activity);
-
}
-
@Override
-
public void handleMessage(Message msg) {
-
Activity activity = mActivity.get();
-
if (activity != null) {
-
activity.handleMessage(msg);
-
}
-
}
-
}
-
private Handler mHandler = new MsgHandler(this);
阅读(1527) | 评论(0) | 转发(0) |