在Listview Android中滚动时堆大小增加

时间:2014-11-13 09:19:24

标签: android android-listview out-of-memory

我想开发像facebook应用程序那样的应用程序。 (**(即,)**在列表项上加载图像,文本,视频以及无限列表行)。这里我将在listview项目上显示采样图像(inSamplesize = 4)以减少堆大小的使用。

这次,滚动listview时堆大小会不断增加。我建议这是因为列表项中的图像对象没有被回收。如果堆大小不断增加,则可能发生OOM(Out Of Memory)异常的可能性。如何实现这一概念并确保OOM异常的可能性较小?

3 个答案:

答案 0 :(得分:1)

确保在view holder listview's中使用adapter模式:

http://www.javacodegeeks.com/2013/09/android-viewholder-pattern-example.html

或者做一些谷歌搜索,基本上所有应用都应该遵循这种模式。

答案 1 :(得分:0)

  1. 在listadapter的getView()中重用convertView应解决OOM异常。

    public View getView(int position, View convertView, ViewGroup parent) {  
    
        if (convertView == null) {
            convertView = mInflater.inflate(R.layout.yourlayout, null);
        }
    
        ImageView iv = (ImageView) convertView.findViewById(R.id.image);
        iv.setImageResource(R.drawable.image);
        return convertView;
    }
    
  2. 使用上面的ViewHolder可以快速滚动

    static class ViewHolder {
        private ImageView imageView;
    }
    
    public View getView(int position, View convertView, ViewGroup parent) {
    
        ViewHolder holder;
    
        if (convertView == null) {
            convertView = mInflater.inflate(R.layout.yourlayout, null);
            holder = new ViewHolder();
            holder.imageView = (ImageView) convertView.findViewById(R.id.image);
            convertView.setTag(holder);
        }
        else {
            holder = (ViewHolder) convertView.getTag();
        }
    
        holder.ImageView.setImageResource(R.drawable.image);
        return convertView;
    }
    

答案 2 :(得分:0)

请勿使用非常大尺寸的图像,如果您在列表中显示图像仅用于拇指根据您的UI调整大小。 Android应用程序的执行只会少于20mb,因此使用大图像会超出可用内存。

并在清单的应用标记中添加 android:largeHeap="true"