weakreference
WeakReference不阻止引用对象被垃圾回收,get()可能返回null。它能减少某些对象之间的强引用保留,但不能自动解决所有内存泄漏;仍需检查消息队列、监听器与其他强引用。参考:Java WeakReference (opens new window)。
# case
# Dialog 的状态管理
private static final class ListenersHandler extends Handler {
private final WeakReference<DialogInterface> mDialog;
public ListenersHandler(Dialog dialog) {
mDialog = new WeakReference<>(dialog);
}
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case DISMISS:
((OnDismissListener) msg.obj).onDismiss(mDialog.get());
break;
case CANCEL:
((OnCancelListener) msg.obj).onCancel(mDialog.get());
break;
case SHOW:
((OnShowListener) msg.obj).onShow(mDialog.get());
break;
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
这是 Handler 持有弱引用的结构示例。调用监听器之前应检查 mDialog.get() 是否为 null,并按业务生命周期清理待处理消息;不能把示例直接当作完整的防泄漏实现。
上次更新: 2026/10/18, 22:14:48