Listview with bitmaps,outofmemoryerror

问题描述:

我搜索了这么多,但我不能帮助自己。 有没有人可以说我的ListView如何解决OutOfMemoryError问题。 只有在我的ListView中添加了50多个位图后才会出现。 据我所知,由于所有的位图,设备内存已满,但是有没有办法回收远离视口的位图?Listview with bitmaps,outofmemoryerror

这里是我的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; 
    } 
} 
+2

位图和内存不足问题在Android中猖獗。从侧边栏到右侧,这似乎回答您的问题:http://stackoverflow.com/questions/477572/strange-out-of-memory-issue-while-loading-an-image-to-a-bitmap-对象 –

+0

他们谈得有点太笼统 –

你应该先了解一个ArrayAdapter是如何工作的。

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

,该指令将让你在LinkedList的当前项目将被显示在当前视图中的一个:

ExtendedBitmap bitm = getItem(position); 

您应该从Activity项目添加到集合,并从那里调用notifyDataSetChanged();。 ArrayAdapter将知道该怎么做。其次,您不应该在ViewHolder中保留实际的位图。您应该存储位图的资源ID或URL,并且只在getView()中获取实际的位图。

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

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

+0

我在我的Activity中使用了notifyDataSetChanged(),它运行良好。我会尝试下载每个位图并将View资源中的资源ID存储在ViewHolder中,但这是这种问题的常用解决方案吗? –

+0

我也是新人。我不知道“通常的解决方案”是什么,但是最近编写了BNR书,作者正在为本书论坛积极回答问题。如果我要写一个类似的应用程序,我会认为他们的解决方案是一个起点,然后研究如何改进它以使我的实现更好。阅读侧栏上的其他Q/A将是一个好的开始。 –

+0

看来,LruCache做到了。非常感谢您的建议! –