我一直在跟踪我的Android应用程序中潜在的内存泄漏,我遇到过一个我不知道该怎么办的内存泄漏。首先,我将描述我正在尝试做的事情。
为了它的价值,我正在为Eclair(2.1,API级别7)构建并在HTC Incredible运行Gingerbread(2.3.7,API级别10)上进行测试。从观察LogCat开始,我假设我的应用程序的最大堆大小约为32MB。
我正在尝试建立一个地址簿,其中有几页联系人。您可以通过向左和向右滚动在页面之间导航,然后通过向上和向下滚动浏览当前页面。为实现此目的,我使用Gallery
其适配器将联系人列表调整为ListView
,其适配器又将单个联系人调整为RelativeLayout
。
一切似乎都运行良好,但是当我在画廊中滑动时,我正在快速耗尽本机(外部)内存 。在Gallery
左右滑动一段时间后,我将HPROF转储器拉到MAT中。在直方图中,我发现我有几百个联系人RelativeLayout
仅由我的联系人ListView
保留。这是我在查看ListView
的[截断] MAT merge_shortest_paths输出时发现的内容:
android.view.ViewRoot$1
+ this$0 android.view.ViewRoot
+ mAttachInfo android.view.View$AttachInfo
+ mScrollContainers java.util.ArrayList
+ array java.lang.Object[303]
+ [110], [112], [114], [116], [118], ... com.example.LeakyListView
+ ...and so forth.
唯一可以保留那些泄露ListView
的{{1}} android.view.View$AttachInfo
字段。问题是,我不知道我的观点是如何进入那里的,所以我对如何堵塞这个泄漏感到茫然。
如何解决此内存泄漏?或者至少,此参考链是如何构建的以及mScrollContainers
,ViewRoot
和{{1 }}?
我会尝试将其分离到一个简单的测试用例并尽快在此处发布代码,但我希望这足以让对话开始。
答案 0 :(得分:3)
你真的应该使用ViewPager而不是Gallery这样的事情:http://android-developers.blogspot.com/2011/08/horizontal-view-swiping-with-viewpager.html