依据:
活动-在每个方向更改上重新创建(oncreate ondestroy)
视图由带两个子对象的ViewFlipper组成:Simple RelativeLayout和ListView
ListView行具有复杂的布局和关联的标记
问题是,我在每次方向更改时都会出现内存泄漏-整个视图布局的活动都会保留在内存中。活动本身是一个上下文,因此只要相关对象愿意,它就会一直留在内存中。所以现在我想知道为什么会发生泄漏。
视图具有setTag()方法。我用它来存储一些关于行的信息(因此listview中的每一行(视图)都有相关的标记)。
但是视图和gc如何处理标签呢?我的标记对象(持有者)包含对视图的引用,但如果视图删除对其标记的引用,则很容易收集这些引用(使用标记本身)。
有人在listviews上遇到过类似的问题吗?
P.S.我想知道GC如何清理布局-大量循环引用、上下文、持有者等…
最佳答案
它很容易泄露方向改变活动的参考。有一些关于这方面的博客文章,我觉得需要阅读:
http://ttlnews.blogspot.com/2010/01/attacking-memory-problems-on-android.html
http://android-developers.blogspot.com/2009/01/avoiding-memory-leaks.html
http://code.google.com/p/android/issues/detail?id=2391
简而言之,在您的onRetainNonConfigurationInstance
方法中,您只需要小心,将对视图对象的任何引用以及活动引用、进度条等都清空。
我使用的一个好的模式是有一个“stateholder”内部类,它确实包含一个活动引用,但是我实现了一个setActivityForTasks
方法,我只是将null传递给它,它反过来将所有活动引用设置为null。然后,当你在方向改变后重新开始你的活动时,你可以调用setActivityForTasks(this)
来重置当前的活动。
一次取走就是删除对onRetainNonConfigurationInstance
中任何活动的引用。