Skip to content
阅读进度

如何理解匿名内部类持有外部 Activity 引用是常见的内存泄漏原因,请举例说明并给出解决方案? ​

返回 性能与稳定性 目录

标准回答 ​

匿名内部类或 Runnable 访问 Activity 成员时可能持有外部实例;若它被长寿命线程、队列或单例保留,Activity 结束后仍不能回收。解决方法是及时取消任务、移除回调或解除注册,并让任务只持有必要的数据。

通俗例子 ​

Activity 里创建匿名 Runnable,交给长期运行的线程。即使页面关闭,任务对外部 Activity 的引用还没释放,整张页面就可能被留住。

深入解释 ​

**泄漏的引用链是什么:**线程池还保存 Runnable,Runnable 又通过外部类引用保存 Activity,Activity 继续持有整棵 View。只要这条强引用链还在,旧页面就可能无法回收。

**怎样处理才完整:**取消不再需要的任务,移除回调,并避免长任务保存页面。改成静态内部类只能去掉隐式外部引用;如果又显式传入并长期保存 Activity,问题仍然存在。

易混淆点 ​

不要只改成静态类就结束排查,真正的引用链可能还有别的入口。

参考资料 ​

内容来源 ​

用完整回答理解机制,用真实证据解释项目。