【问题标题】:Listview with bitmaps, outofmemoryerror带有位图的列表视图,内存不足错误
【发布时间】:2013-10-25 00:49:20
【问题描述】:

我搜索了很多,但我无法帮助自己。 有没有人可以说如何为我的 ListView 修复 OutOfMemoryError。 它仅在将 50 多个位图添加到我的 ListView 后发生。 我知道由于所有位图,设备内存已满,但是有没有办法回收远离视口的位图?

这是我的 ListView 的适配器:

public class ImageAdapter extends ArrayAdapter<ExtendedBitmap>{
    private LinkedList<ExtendedBitmap> items;
    LayoutInflater mInflater = LayoutInflater.from(getContext());

    public ImageAdapter(Context context, int resource, LinkedList<ExtendedBitmap> items) {
        super(context, resource, items);
        this.items = items;
    }

    public void add(ExtendedBitmap bitmap)
    {
        items.add(bitmap);
        notifyDataSetChanged();
    }

    public void addFirst(ExtendedBitmap bitmap)
    {
        items.addFirst(bitmap);
        notifyDataSetChanged();
    }

    public ExtendedBitmap getBitmap(int position){
        return items.get(position);
    }

    @Override
    public View  getView(int position, View convertView, ViewGroup parent){
        ViewHolder holder; 

        if (convertView == null) { 
            convertView = mInflater.inflate(R.layout.extended_image, parent, false); ;
             holder = new ViewHolder();  
             holder.image = (ImageView) convertView.findViewById(R.id.image); 
             //holder.image.setOnTouchListener(new Touch());  
             convertView.setTag(holder); 
        }else { 
             holder = (ViewHolder) convertView.getTag(); 
        }

        holder.image.setImageBitmap(items.get(position).getBitmap());

        return convertView; 
    }
}

【问题讨论】:

标签: android image listview memory bitmap


【解决方案1】:

您应该首先了解 ArrayAdapter 的工作原理。

当您使用super(context, resource, items); 调用超级的构造函数时,它会获得对您正在使用的集合(项目)的引用。你不需要在你的类中保留对该集合的引用。

这条指令将为您提供 LinkedList 中的当前项目,该项目是要在当前视图中显示的项目:

ExtendedBitmap bitm = getItem(position);

您应该从Activity 将项目添加到集合中,然后从那里调用notifyDataSetChanged();。 ArrayAdapter 会知道该怎么做。

其次,您不应将实际位图保留在 ViewHolder 中。您应该存储位图的资源 ID 或 URL,并且只在 getView() 中获取实际的位图。

您可以使用LruCache 来存放位图。然后,您将需要逻辑来尝试从 LruCache 获取位图或根据需要重新创建它(如果需要)。

希望这会有所帮助。我从 Big Nerd Ranch Android 书籍中了解到这一点。

【讨论】:

  • 我在我的 Activity 中使用 notifyDataSetChanged(),效果很好。我将尝试下载每个位图并将 Ressource ID 存储在 ViewHolder 中,但这是解决此类问题的常用解决方案吗?
  • 我也是新手。我不知道“通常的解决方案”是什么,但是 BNR 书是最近写的,作者们正在为本书的论坛积极回答问题。如果我要编写一个类似的应用程序,我会将他们的解决方案视为一个起点,然后研究如何改进它以使我的实现更好。阅读侧边栏上的其他 Q/A 将是一个好的开始。
  • 似乎是 LruCache 做到了。非常感谢您的建议!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-04-13
  • 2013-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多