安卓ListView优化(1)

安卓ListView优化-使用缓存View

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

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


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

public class ListViewAdapter {

	public static void setListViewAdpter(final Context context,ListView lv){
		String[] mfrom=new String[]{"image","title"};
		int[] mto=new int[]{R.id.image,R.id.title};
		final List<Map<String,Object>> itemList=new ArrayList<Map<String,Object>>();
		Map<String,Object> mMap=null;
		for(int i=0;i<1000000;i++){
			mMap=new HashMap<String,Object>();
			mMap.put("image", R.drawable.two);
			mMap.put("title", "美女:aspen");
			itemList.add(mMap);
		}
		SimpleAdapter sa=new SimpleAdapter(context,itemList,R.layout.listview_item,mfrom,mto){

			@Override
			public View getView(int position, View convertView, ViewGroup parent) {
				// TODO Auto-generated method stub
				 long startTime = System.nanoTime();
				LayoutInflater mInflater=LayoutInflater.from(context);
				
				if (convertView == null) {
					convertView = mInflater.inflate(R.layout.listview_item, parent, false);
				}
				((ImageView) convertView.findViewById(R.id.image)).setImageResource(Integer.parseInt(itemList.get(position).get("image").toString()));
				((TextView) convertView.findViewById(R.id.title)).setText(itemList.get(position).get("title").toString());
				// 停止计时
	            long endTime = System.nanoTime();
	            // 计算耗时
	            long val = (endTime - startTime) / 1000L;
	            System.out.println("位置:"+position+":"+"时间:"+val+""+convertView);
				return convertView;
				
			}
			
		};
		lv.setAdapter(sa);
	}
}

看看结果

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


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



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

if (convertView == null) {
					convertView = mInflater.inflate(R.layout.listview_item, parent, false);
				}
据谷歌开发者大会上所说,加载速度会快上200%左右。(有时间继续)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值