0

我遇到内存不足错误。我检查了 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(我猜是为了测量所有孩子的 vie),然后才继续定位 1,2,3... 为什么会发生这种情况?这会导致OOM问题吗?我从另一个适配器调用这个适配器,我猜是什么让一切变得复杂。

我还在 onDestroy 处取消绑定所有可绘制对象,并将 imageView.getDrawable().setCallback(null) 设置为所有 imageViews 它仍然不起作用

4

3 回答 3

2

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

PS 为什么要存储上下文对象?您可以随时通过调用 parent.getContext() 在 getView() 方法中获取它

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

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

于 2012-12-13T15:11:48.343 回答
1

您应该确保传递Application上下文(getApplicationContext())而不是活动上下文(this例如),因为使用Activity上下文可能会导致内存泄漏,因为它们绑定到的对象(view在您的实现中)不会被垃圾收集导致内存泄漏和 OutOfMemory例外。

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

于 2012-12-13T15:08:39.830 回答
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;
}
于 2012-12-13T15:05:41.867 回答