使用适配器的内存不足

时间:2012-12-13 14:58:13

标签: android memory-leaks android-context

我出现内存不足错误。我检查了DDMS,发现我分配更多内存的地方是在我的适配器的getView()方法中。以这种方式创建对象对我来说是一种更好的方式:

view=new ImageView(myContext);

这是我的getView()方法的一个例子:

public View getView(int position, View convertView, ViewGroup parent) {
    View view = null;
    if (convertView==null){
        view=new ImageView(myContext);
        view.setLayoutParams( new AbsListView.LayoutParams(columnWidth,columnWidth));
        view.setBackgroundColor(Color.GRAY);
    }else{
        view=convertView;
        convertView.setBackgroundColor(Color.GRAY);
    }
    return view;
}

我在c'tor中得到了上下文:

public emptySquaresAdapter( Context myContext,) {
    super();
    this.myContext=myContext;
}

我读到了关于上下文泄漏的情况,是吗?

编辑:

在这种情况下,我会立即在屏幕上显示所有视图,因此从不使用转换后的视图(我不需要滚动显示更多视图)。

此适配器在屏幕上显示12个方块。方法getView被调用了12次,位置为0(我想测量所有的孩子争吵),然后才继续定位1,2,3 ...... 为什么会这样?这会造成OOM问题吗? 我从另一个适配器调用这个适配器,我想这会使一切变得复杂。

我还在onDestroy上取消绑定所有drawable,并将imageView.getDrawable()。setCallback(null)设置为所有的imageViewsIt仍然无法正常工作

3 个答案:

答案 0 :(得分:2)

您发布的代码没问题。问题可能在其他地方。

P.S。为什么要存储上下文对象?您可以通过调用parent.getContext()

在getView()方法中随时获取它

根据我的经验,只要你不坚持(你实际上在做什么),你传递的是什么样的背景并不重要。

但是如果你的适配器本身没有存储在某个地方并且只是一个活动的一部分它应该没问题,因为适配器只会获得活动的gc。

答案 1 :(得分:1)

您应该确保传递Application上下文(getApplicationContext())而非活动上下文(例如this),因为使用Activity上下文会导致内存泄漏作为它们绑定的对象(在你的实现中view)将不会被Garbage Collected引起内存泄漏和OutOfMemory异常。

您应该避免的另一件事是每次调用View时都会创建一个新的getView()convertView是一个循环视图(滚动时显示的视图),将用作滚动后显示的行的新View。使用它而不是每次调用都创建view对象(如果GC收集它,它不会导致Outofmemory异常,但是当GC运行时可能导致慢滚动)。

答案 2 :(得分:0)

你永远不会在第一个实例中分配convertView。因此,每次调用getView()时,您都会创建一个新的ImageView

public View getView(int position, View convertView, ViewGroup parent) {
    View view = null;
    if (convertView==null){
        convertView=new ImageView(myContext);
        convertView.setLayoutParams( new AbsListView.LayoutParams(columnWidth,columnWidth));
        convertView.setBackgroundColor(Color.GRAY);
    }else{

        convertView.setBackgroundColor(Color.GRAY);
    }
    return convertView;
}