0
点赞
收藏
分享

微信扫一扫

Android 内存分析 -- 杂记


纯笔记

  • ​​Android 内存泄漏实例分析​​
  • ​​性能优化合辑​​

问题

​MyLinkMovementMethod​​​ 为单例,​​TouchableSpan​​​ 一旦被实例化出来,除非手动置为 ​​null​​​,否则不会释放,而由于它是 ​​TagTextView​​​ 的内部类,所以持有这个 ​​TextView​​​ 的引用,​​TextView​​​ 是被​​MainActivity​​​ 创建出来的,最终导致 ​​MainActivity​​ 无法被回收。

MyLinkMovementMethod --> TagTextView.TouchableSpan --> TagTextView --> MainActivity

Solution

  • ​TagTextView.Span​​​ 变为​​static​​​,静态内部类不持有外部类的引用,就像​​Handler​​ 要用static一样。
  • ​MyLinkMovementMethod​​​ 中不能有​​Span​​​ 这个成员变量,让​​Span​​ 引用只存在于某个方法的作用域中。
  • 当​​TagTextView​​​ 的​​TouchEvent​​​ 为​​UP​​​ 时,应手动将​​Span​​​ 置为​​null​​。

设计角度看问题

​tag​​​ 的点击事件应该传递到外部去,不应该由 ​​Span​​​ 自己处理跳转到另外一个 ​​Activity​​ 中去,这不符合设计原则,如果某个Tag跳转的activity不是固定的怎么办呢?

自定义View的职责应该是单一的,只负责接收事件,解析事件,具体的解决事件应该由上层来处理,不然就没法复用了。


举报

相关推荐

0 条评论