当前位置:首页 > 开发 > 移动开发 > 正文

关于ListView中性能优化中图片加载问题

发表于: 2012-03-06   作者:酷的飞上天空   来源:转载   浏览:
摘要: ListView的性能优化网上很多信息,但是涉及到异步加载图片问题就会出现问题。 具体参看上篇文章http://314858770.iteye.com/admin/blogs/1217594   如果每次都重新inflate一个新的View出来肯定会造成性能损失严重,可能会出现listview滚动是很卡的情况,还会出现内存溢出。 现在想出一个方法就是每次都添加一个标识,然后设置图

ListView的性能优化网上很多信息,但是涉及到异步加载图片问题就会出现问题。

具体参看上篇文章http://314858770.iteye.com/admin/blogs/1217594

 

如果每次都重新inflate一个新的View出来肯定会造成性能损失严重,可能会出现listview滚动是很卡的情况,还会出现内存溢出。

现在想出一个方法就是每次都添加一个标识,然后设置图片的时候检查这个标识,如果不相符则忽略此次。

 

适配器中的关键代码

	@Override
	public View getView(int position, View convertView, ViewGroup parent) {
		ViewHolder viewHolder;
		if(convertView == null){
			viewHolder = new ViewHolder();
			convertView = LayoutInflater.from(context).inflate(R.layout.listview_item, null);
			viewHolder.imageView = (ImageView)convertView.findViewById(R.id.imageView);
			viewHolder.textView = (TextView)convertView.findViewById(R.id.textView);
			convertView.setTag(viewHolder);
		}
		viewHolder = (ViewHolder)convertView.getTag();
		
		viewHolder.textView.setText(stringList.get(0)[0]);
		final ImageView imageView = viewHolder.imageView;
		imageView.setImageDrawable(null); //reset default
		imageView.setTag(position);
		asyncImageLoader.loadDrawable(stringList.get(0)[1], new AsyncImageLoader.ImageCallback() {
			@Override
			public void imageLoaded(Drawable imageDrawable, String imageUrl,int key) {
				if((Integer)imageView.getTag() != key) return;  //不是当前显示的View,则忽略此次
				if(imageDrawable != null){
					imageView.setImageDrawable(imageDrawable);
				}
			}
		},position);
		return convertView;
	}

 

	static class ViewHolder{
		TextView textView;
		ImageView imageView;
	}

 

异步加载图片的代码

	public Drawable loadDrawable(final String imageUrl,
			final ImageCallback callback,final int key) {

		if (!URLUtil.isValidUrl(imageUrl)) {
			callback.imageLoaded(null, imageUrl,key);
			return null;
		}

		if (imageCache.containsKey(imageUrl)) {
			SoftReference<Drawable> softReference = imageCache.get(imageUrl);
			if (softReference.get() != null) {
				Log.d(AsyncImageLoader.class.getName(),
						"imageCache has this image,use cache. the url:"
								+ imageUrl);
				callback.imageLoaded(softReference.get(), imageUrl,key);
				return softReference.get();
			}
		}
      //更多代码
	}
 

	public interface ImageCallback {
		public void imageLoaded(Drawable imageDrawable, String imageUrl,int key);
	}
 

经过此次修改,再测试时不会出现之前的内存持续增长  和 滚动很卡的情况。

关于ListView中性能优化中图片加载问题

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
在最近的项目中,遇到一个关于WPF中同时加载多张图片时,内存占用非常高的问题。 问题背景: 在一个
在android开发中Listview是一个很重要的组件,它以列表的形式根据数据的长自适应展示具体内容,用户可
listview加载性能优化ViewHolder 分类: android 在android开发中Listview是一个很重要的组件,它以
在android开发中Listview是一个很重要的组件,它以列表的形式根据数据的长自适应展示具体内容,用户
在android开发中Listview是一个很重要的组件,它以列表的形式根据数据的长自适应展示具体内容,用户
在listview/gridview中使用UIL来display每个item的图片,当图片数量较多需要滑动滚动时会出现卡顿,而
写这篇文章并不是教大家怎么样用listview异步加载图片,因为这样的文章在网上已经有很多了,比如这
先说说这篇文章的优点把,开启线程异步加载图片,然后刷新UI显示图片,而且通过弱引用缓存网络加载
  现在我们终于可以通过这个框架来实现ListView中加载图片了,至于ViewPager还是别的,原理其实都
对于一些图片多,页面长的网页来说,如果每次打开页面加载全部的网页内容,页面加载速度势必会受到
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号