实现ListAdapter和可能的内存泄漏

时间:2011-02-24 19:22:17

标签: android listadapter

我有一个非常简单的活动:

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。

我做错了什么?

2 个答案:

答案 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次并分析堆。之后,您将能够看到泄漏的对象和泄漏的对象层次结构的根。