外观
如何理解匿名内部类持有外部 Activity 引用是常见的内存泄漏原因,请举例说明并给出解决方案?
标准回答
匿名内部类或 Runnable 访问 Activity 成员时可能持有外部实例;若它被长寿命线程、队列或单例保留,Activity 结束后仍不能回收。解决方法是及时取消任务、移除回调或解除注册,并让任务只持有必要的数据。
通俗例子
Activity 里创建匿名 Runnable,交给长期运行的线程。即使页面关闭,任务对外部 Activity 的引用还没释放,整张页面就可能被留住。
深入解释
**泄漏的引用链是什么:**线程池还保存 Runnable,Runnable 又通过外部类引用保存 Activity,Activity 继续持有整棵 View。只要这条强引用链还在,旧页面就可能无法回收。
**怎样处理才完整:**取消不再需要的任务,移除回调,并避免长任务保存页面。改成静态内部类只能去掉隐式外部引用;如果又显式传入并长期保存 Activity,问题仍然存在。
易混淆点
不要只改成静态类就结束排查,真正的引用链可能还有别的入口。
参考资料
内容来源
- Android · AI Agent 知识手册 · 原条目
3.2.1