情景 1:
静态变量引用或内部持有 Activity,如果 Activity 销毁时没有释放就会导致 Activity 发生泄漏。
解决方法:
- 在 Activity 的 onDestroy() 方法中将静态变量置空;
- 避免这样的写法。
情景 2:
非静态内部类(包括匿名内部类)造成内存泄漏,比如 Handler。
解决方法:
- 在 Activity 的 onDestroy() 方法中 remove Handler 消息队列中的消息与
Runnable 对象。 - 使用静态内部类加 WeakReference(弱引用)
public static class StaticHandler extends Handler {
private final WeakReference<Activity> mActivity;
public StaticHandler(Activity activity) {
mActivity = new WeakReference<Activity>(activity);
}
@Override
public void handleMessage(Message msg) {
Activity activity = mActivity.get();
if (activity != null) {
......
}
}
}
情景 3:
如果单例中持有 Activity 的 Context,当这个 Context 所对应的 Activity 退出时,就会导致 Activity 发生泄漏,因为单例的生命周期和 Application 的一样长。
解决方法:
在单例中将 Activity 的 Context 转换为 Application 的 Context。
参考: