前言 : 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();
}
Logo

欢迎加入 MCP 技术社区!与志同道合者携手前行,一同解锁 MCP 技术的无限可能!

更多推荐