安卓ListView优化(1)

本文介绍如何通过缓存View来优化Android中ListView的性能,避免ANR和OOM错误。通过复用convertView减少View创建次数,提高加载速度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

安卓ListView优化-使用缓存View

最近在做项目的时候遇到了ListView大量数据加载问题,在数据量达到一定程度的时候,listView可能会出现卡顿甚至ANR或者OOM的错误,我们知道如果在UI线程(也叫Main线程)中如果你一个动作的时间超过5秒没有完成,主线程就会被堵塞,就会出现ANR(未响应)错误,而如果大量数据加载在内存中的时候,如果超出了虚拟机分配给该应用的最大内存就会出现OOM(内存溢出 )的错误,为了再使用ListView加载大量数据时候不会出现上面的错误,我们可以从2个层次来优化:

   我们知道ListView是加载数据的过程,是getCount()->getView()也就是首先得到你要加载数据的条数和你要加载的数据的View,在每次加载一条数据的时候就要创建一个View,我从别处下载了一张图来显示ListView的原理


那么我们可以每次生成View之前去判断系统是否已经缓存了这个View,如果已经缓存了就不需要自己在去生成,这样就会节省很多时间,看我如下代码:

[java]  view plain  copy
  1. public class ListViewAdapter {  
  2.   
  3.     public static void setListViewAdpter(final Context context,ListView lv){  
  4.         String[] mfrom=new String[]{"image","title"};  
  5.         int[] mto=new int[]{R.id.image,R.id.title};  
  6.         final List<Map<String,Object>> itemList=new ArrayList<Map<String,Object>>();  
  7.         Map<String,Object> mMap=null;  
  8.         for(int i=0;i<1000000;i++){  
  9.             mMap=new HashMap<String,Object>();  
  10.             mMap.put("image", R.drawable.two);  
  11.             mMap.put("title""美女:aspen");  
  12.             itemList.add(mMap);  
  13.         }  
  14.         SimpleAdapter sa=new SimpleAdapter(context,itemList,R.layout.listview_item,mfrom,mto){  
  15.   
  16.             @Override  
  17.             public View getView(int position, View convertView, ViewGroup parent) {  
  18.                 // TODO Auto-generated method stub  
  19.                  long startTime = System.nanoTime();  
  20.                 LayoutInflater mInflater=LayoutInflater.from(context);  
  21.                   
  22.                 if (convertView == null) {  
  23.                     convertView = mInflater.inflate(R.layout.listview_item, parent, false);  
  24.                 }  
  25.                 ((ImageView) convertView.findViewById(R.id.image)).setImageResource(Integer.parseInt(itemList.get(position).get("image").toString()));  
  26.                 ((TextView) convertView.findViewById(R.id.title)).setText(itemList.get(position).get("title").toString());  
  27.                 // 停止计时  
  28.                 long endTime = System.nanoTime();  
  29.                 // 计算耗时  
  30.                 long val = (endTime - startTime) / 1000L;  
  31.                 System.out.println("位置:"+position+":"+"时间:"+val+""+convertView);  
  32.                 return convertView;  
  33.                   
  34.             }  
  35.               
  36.         };  
  37.         lv.setAdapter(sa);  
  38.     }  
  39. }  

看看结果

加载出来的列表时百万级的,会有一定的加载时间,但是没有出现ANR错误


看一下加载时间对比和对应的布局View:



我们可以看到在加载前面6列,也就一屏列表的时候他会出现它加载的时间比较长,而如果我们用手去滑动的时候加载的时间就会大大的缩短,这就是因为我们少了View的重复生成,利用了缓存机制,注意这句:

[java]  view plain  copy
  1. if (convertView == null) {  
  2.                     convertView = mInflater.inflate(R.layout.listview_item, parent, false);  
  3.                 }  
据谷歌开发者大会上所说,加载速度会快上200%左右。(有时间继续)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值