破坏视图(布局)

时间:2011-03-24 12:38:30

标签: android listview memory-leaks view garbage-collection

我现在正在与内存泄漏作斗争。所以我很好奇是否有任何方法可以手动销毁视图(在活动onDestroy方法中)? 由于父子引用,上下文引用,标记等,整个布局(activity contentView)有点复杂。

GC现在无法收集我的布局。问题是隐藏在视图结构中...所以找到它的唯一方法是尝试破坏叶子视图,所以在某些时候GC会收集根视图并让我知道问题所在的位置。

我的布局结构:ViewFlipper(RelativeLayout,ListView(ViewFlipper(RelativeLayout,RelativeLayout)))

2 个答案:

答案 0 :(得分:10)

您可以从ViewGroup中删除视图,但无法手动销毁视图。如果您遇到内存泄漏,通常是因为您在视图之外持有对Context的长期引用。

  1. 不要在静态字段中存储任何具有Context的内容(即Drawables - Bitmaps就可以了)
  2. 删除所有处理程序,清除所有计时器
  3. 不要在Threads / AsyncTasks中保留Contexts,或者确保它们是弱引用的。
  4. View可以包含与其他视图相关的信息(即另一个视图的上下文),因为所有视图都被销毁了 - 很可能是因为Context被某些东西所持有(并且上下文有句柄)你无法释放记忆的大多数东西 - 即你的所有观点。

答案 1 :(得分:1)

您的视图中是否有可能需要停止的处理程序/消息?

我遇到了类似的问题,我定期在视图中发送消息以获取动画。我需要停止/忽略消息,并在触发活动OnDestroy()后停止排队。