Android ListView使用convertView解决内存溢出问题(推介使用recyclerview,listview已过时)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/u013470176/article/details/50379443
比方说在加载各种图片的时候,listview不及时回收的话,可能会造成内存溢出,这个时候就是看getview方法的时候了。

public View getView(int position, View convertView, ViewGroup parent) {
      
      ViewHolder holder = null;
      if(convertView == null){
        // 不存在则加载新布局
        LayoutInflater inflater = (LayoutInflater) parent.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        convertView = inflater.inflate(R.layout.item_pic_list, null);
        holder = new ViewHolder();
        holder.text = (TextView) convertView.findViewById(R.id.item_title);
        holder.image = (ImageView) convertView.findViewById(R.id.item_image);
        convertView.setTag(holder);
      } else {
        // 存在则加载原来布局,布局重用,无需重复加载
        holder = (ViewHolder) convertView.getTag();
      }
      
      int no = position + 1;
      holder.text.setText("图片列表测试:" + no);
      // ir是i5suoi库中ImageResource的实例,专门负责单例加载图片资源,并及时释放长时间不用的图片内存
      // 先设置成默认图片,以便能够将列表中不显示在屏幕上的图片及时回收
      holder.image.setImageBitmap(ir.getBitmap(getResources(), R.drawable.ic_launcher));
      // 加载并显示网络图片,每个图片只加载一次,然后存到本地缓存
      ir.getBitmap(holder.image, pic.replace("_num", "" + no % 60),
          holder.image.getWidth(), holder.image.getHeight());
      
      return convertView;
    }

代码注释很清晰,这里就不多做解释,只说一些注意事项。首先是本地的图片也要用ImageResource加载,才能保证每个图片只加载一次,不浪费资源和内存。其次,也是最重要的,虽然不用每次重新加载布局,但是有必要将图片重新设置成默认的,表示原来的图片暂不使用了,以便系统能够在内存使用过大时及时收回当前界面不使用的图片。
最后,如果上述你都做到的话,你的listview已经优化的很好了。针对你的问题,你的listview控件高度是否设置为fill_parent,因为warp会导致listview滑动中无限计算自身高度。你的文本加载是否做过线程以及多次重复加载的问题处理。你的item中变量是否多次无限生成新的内存对象等等。
展开阅读全文

没有更多推荐了,返回首页