我有一个非常简单的活动:
public class A extends ListActivity implements ListAdapter
{
@Override public void onCreate(Bundle b)
{
super.onCreate(b);
setListAdapter(this); //no problems without this line
}
// etc... (empty implementation ListAdapter interface functions)
}
当我从其他活动开始此活动时:
startActivity(new Intent(this, A.class));
和bush“后退”按钮(为了破坏这个活动),堆长大约13..15千字节,即使GC运行完毕也不会减少回来。
当我再次开始并完成这项活动时,头部会越来越多
为了监视堆大小,我在Eclipse中使用了DDMS。
我做错了什么?
答案 0 :(得分:1)
我真的建议你不要在与Activity相同的类中实现ListAdapter。它不是一个好的编程实践,所有Android教程都创建了单独的类作为适配器。它们肯定不会将适配器和活动合并到一个类中。例如,考虑GridView tutorial作为我的观点的一个例子。
问题出在我认为setListAdapter(this)
的地方。 “this”指的是ListActivity类A,它无论如何都不是适配器。为了正确使用setListAdapter,您应该传递ArrayAdapter或创建自己的Adapter类(实现ListAdapter,并扩展BaseAdapter)并实例化它。
我认为这可以解决您的问题,因为您将视图的适配器设置为活动本身,这似乎是递归的或某种性质的“无限循环”。
答案 1 :(得分:0)
您是否在getView()
实施的ListAdapter
方法中缓存了视图?如果答案是肯定的,那么缓存可能是内存泄漏的原因。例如,由于使用静态成员或View.setTag(int, Object)
来存储视图,可能会发生泄漏。
无论如何,我建议您安装MAT Plugin,开始和完成此活动5-10次并分析堆。之后,您将能够看到泄漏的对象和泄漏的对象层次结构的根。