what
主要表现为Activity退出后内存无法释放。
why
Handler消息队列中存在未分发的消息,这些消息引用了Handler,而Handler是Activity的非静态内部类,非静态内部类会持有外部类的引用,造成Activity无法释放,造成内存泄漏。
how
知道原因就很能很好的进行规避
- 尽量避免泄漏的使用场景,一般为延迟发送消息。
- 在 Activity 里的 onDestroy 回调方法中,调用 handler的removeCallbacksAndMessages(null)方法,清除消息队列中message。
- 使用静态内部类,对外部使用弱引用:
private static class MyHandler extends Handler {
private final WeakReference<ShanActivity> mActivity;
public MyHandler(ShanActivity activity) {
mActivity = new WeakReference<ShanActivity>(activity);
}
@Override
public void handleMessage(Message msg) {
ShanActivity activity = mActivity.get();
if (activity != null) {
//do Something
}
}
- 将Handler单独封装成类,内部使用弱引用Activity。
public class WeakRefHandler extends Handler {
private WeakReference<Callback> mWeakReference;
public WeakRefHandler(Callback callback) {
mWeakReference = new WeakReference<Handler.Callback>(callback);
}
@Override
public void handleMessage(Message msg) {
if (mWeakReference != null && mWeakReference.get() != null) {
Callback callback = mWeakReference.get();
callback.handleMessage(msg);
}
}
}