外观
多屏反复进入退出后,怎样排查快照、Surface 和监听器未释放?
标准回答
先建立资源清单,给每类资源指定创建者和释放者,再检查成功、失败、取消、重建和断连路径。排查时既看 Java 引用,也看图形或 native 资源;不能只用一次 GC 后的 Java 堆大小判断是否全部释放。
通俗例子
过渡动画取消时移除了可见图层,但回调对象仍持有快照和 Activity;界面看起来已经退出,资源仍可能因引用存活而无法回收。
深入解释
**用所有权整理生命周期:**快照、图层、显示资源、监听和线程任务可能有不同持有者。跨模块交接时要明确谁在结束后负责清理。
**把终止路径收敛:**正常完成与取消应汇合到可重复调用的清理逻辑,防止二次释放或遗漏。旧回调返回后也不应重新注册已结束的会话。
**用重复场景观察趋势:**固定次数反复进出,观察存活对象和相关资源是否持续增长,再沿持有链或系统资源信息定位,避免把合理缓存误判成泄漏。
追问与回答
WeakReference 能彻底解决吗?
不能替代取消任务、解除监听及释放外部资源;它只改变某条 Java 引用关系。
内存上涨就是泄漏吗?
需要区分缓存、峰值分配与不可回收持有,结合稳定运行后的趋势判断。
易混淆点
此题是针对项目的合理延伸,不能把示例当作简历已发生的事故。
进一步举证
- 列出项目真实资源类型和释放接口。
- 准备一次异常退出后仍能完整清理的代码流程。
内容来源
- Android · AI Agent 知识手册 · 原条目
resume-R16