Skip to content
阅读进度

多屏反复进入退出后,怎样排查快照、Surface 和监听器未释放? ​

返回 多屏互动项目 目录

标准回答 ​

先建立资源清单,给每类资源指定创建者和释放者,再检查成功、失败、取消、重建和断连路径。排查时既看 Java 引用,也看图形或 native 资源;不能只用一次 GC 后的 Java 堆大小判断是否全部释放。

通俗例子 ​

过渡动画取消时移除了可见图层,但回调对象仍持有快照和 Activity;界面看起来已经退出,资源仍可能因引用存活而无法回收。

深入解释 ​

**用所有权整理生命周期:**快照、图层、显示资源、监听和线程任务可能有不同持有者。跨模块交接时要明确谁在结束后负责清理。

**把终止路径收敛:**正常完成与取消应汇合到可重复调用的清理逻辑,防止二次释放或遗漏。旧回调返回后也不应重新注册已结束的会话。

**用重复场景观察趋势:**固定次数反复进出,观察存活对象和相关资源是否持续增长,再沿持有链或系统资源信息定位,避免把合理缓存误判成泄漏。

追问与回答 ​

WeakReference 能彻底解决吗? ​

不能替代取消任务、解除监听及释放外部资源;它只改变某条 Java 引用关系。

内存上涨就是泄漏吗? ​

需要区分缓存、峰值分配与不可回收持有,结合稳定运行后的趋势判断。

易混淆点 ​

此题是针对项目的合理延伸,不能把示例当作简历已发生的事故。

进一步举证 ​

  • 列出项目真实资源类型和释放接口。
  • 准备一次异常退出后仍能完整清理的代码流程。

内容来源 ​

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