前言 : handler允许发送延时消息,如果在延时期间用户关闭了Activity,那么Activity就会泄露,这个泄露是因为Message会持有Handler,而又因为Java的特性,内部类会持有外部类,使得Handler被Handler持有,这样最终就导致Activity泄露。
解决方案 :
将 Handler 定义成静态的内部类,在内部持有 Activity 的弱引用,并及时移除所有消息。
public class SafeHandler<T> extends Handler {
private WeakReference<T> innerObject;
public SafeHandler(T object) {
this.innerObject = new WeakReference<T>(object);
}
public T getInnerObject() {
return innerObject == null ? null : innerObject.get();
}
@Override
public void handleMessage(Message msg) {
if (getInnerObject() == null)
return;
super.handleMessage(msg);
}
}
在Activity.onDestory()前移除消息
@Override
protected void onDestroy() {
safeHandler.removeCallbacksAndMessages(null);
super.onDestroy();
}