`
酷的飞上天空
  • 浏览: 521726 次
  • 性别: Icon_minigender_1
  • 来自: 无锡
社区版块
存档分类
最新评论

关于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);
	}
 

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

0
0
分享到:
评论

相关推荐

    ListView性能优化之视图缓存

    ListView 的性能优化是一个复杂的问题,需要从多方面入手,包括 Adapter 的优化、视图缓存、数据加载优化等。通过使用 convertView 机制和 ViewHolder 模式,可以大幅度提高 ListView 的性能。同时,我们还需要注意...

    Android开发之listview优化+图片异步加载缓存+避免图片显示闪烁

    本篇将深入探讨如何对ListView进行优化,以及如何实现图片的异步加载和缓存策略,以避免这些问题。 **1. ListView优化** ListView的优化主要涉及以下几个方面: 1.1 **convertView复用机制**:ListView的Adapter...

    关于listview item重用导致图片重复加载 图片重新请求

    然而,在实现ListView时,由于其内部机制,可能会出现一个问题,即ListView中的item(列表项)重用导致图片重复加载,这不仅会消耗不必要的网络资源,还可能影响用户体验。本文将深入探讨这个问题,并提供解决方案。...

    listview加载多幅图片

    总之,ListView加载多幅图片涉及到ImageList的使用,图片的加载和存储策略,以及性能优化。通过合理的编程实践,可以创建出流畅且高效的图片展示效果。同时,理解并掌握这些知识点对于开发高质量的UI界面至关重要。

    Listview的异步加载性能优化

    首先,ViewHolder模式是ListView性能优化的基础。这个模式的主要目的是减少对视图的查找和更新操作,通过复用已创建的视图来避免每次滚动时创建新的视图对象。在`getView()`方法中,我们首先检查convertView是否为...

    listview高级部分,性能优化的demo

    1. **ViewHolder模式**:这是ListView性能优化的核心。通过复用已创建的视图,避免频繁的findViewById操作,减少内存分配,提升列表滑动的流畅性。在getView方法中,通过convertView参数检查并重用已存在的视图,而...

    ListView异步加载图片

    在实际项目中,还应考虑优化ListView的滚动性能,如使用ViewHolder模式减少视图查找的开销,以及根据ListView的可见区域动态加载或取消加载图片,避免一次性加载过多图片导致内存压力过大。这些技巧与异步加载图片...

    listview的图像加载

    然而,当ListView中的每一项包含网络图片时,会遇到一些挑战,比如图片加载错位、错乱等问题。这些问题主要源于ListView的重用机制和图片加载的延迟。针对这些问题,我们可以采用缓存机制和第三方库如xutil来优化...

    ListView优化及加载图片时内存溢出

    然而,如果不进行适当的优化,ListView可能会导致性能问题,甚至触发内存溢出(OOM)异常,尤其是在加载图片时。本篇将深入探讨ListView的优化策略以及如何避免在加载图片时出现内存溢出。 1. **ListView优化策略**...

    Android ListView性能优化

    因此,对ListView进行性能优化至关重要。本文将详细介绍几个关键的优化策略。 1. 使用ViewHolder模式 ViewHolder模式是ListView优化的核心技巧,它可以避免在滚动时频繁地创建和查找视图对象。通过创建一个...

    listview在可视区域加载网络图片

    7. **结合RecycleView**:尽管ListView是经典的列表控件,但现在更推荐使用RecycleView,因为它提供了更多的自定义选项和性能优化。 8. **使用 Fresco 图片加载库**:Fresco 是 Facebook 开源的一个强大的图片加载...

    listview 异步加载网络图片

    10. **总结**:在Android的ListView中实现异步加载网络图片,需要结合异步处理框架、选择合适的图片库、优化缓存策略、合理管理内存,并对ListView进行优化。通过这些手段,可以显著提升应用的性能和用户体验。

    Android中ListView全面完美的网络图片的异步加载

    然后,我们谈谈**LruCache**(Least Recently Used Cache)在图片加载中的作用。LruCache是Android提供的一个基于最近最少使用原则的内存缓存策略。通过将图片数据存储在内存中,可以快速访问已加载过的图片,减少...

    android listview从mysql加载数据和图片

    以上就是从MySQL加载数据并在Android ListView中显示的整个流程,涵盖了前后端的交互以及客户端的性能优化。这个过程中需要注意各个环节的协同工作,以实现高效、稳定且用户友好的数据和图片加载体验。

    Android Listview异步加载图片

    综上所述,Android ListView中异步加载图片是优化用户体验的关键。通过选择合适的异步加载策略和处理图片错位问题,我们可以确保ListView流畅运行,提供优质的用户体验。同时,利用第三方库可以大大简化代码,提高...

    listview加载网络图片

    在描述中提到,提供的代码资源可以解决大部分开发者遇到的头疼问题,即如何优化ListView的图片加载。通常,直接从网络加载图片会消耗大量的内存和CPU资源,导致应用卡顿,甚至崩溃。为了解决这个问题,开发者需要...

    listview优化和异步加载全攻略

    然而,如果不进行适当的优化,ListView可能会遇到性能问题,比如滚动不流畅、内存泄漏等。本攻略将深入探讨ListView的优化策略以及异步加载技术,以确保用户体验的顺畅。 一、ListView的基本优化 1. 使用...

    ListView性能优化系列之一

    这篇博客“ListView性能优化系列之一”着重探讨了如何通过深入理解源码和利用特定工具来提升ListView的性能。 首先,了解ListView的工作原理是优化的基础。ListView采用的是滚动复用机制,即“视图回收”...

    listview异步加载图片

    然而,如果直接在ListView中加载图片,可能会导致性能问题,比如滚动卡顿。为了解决这个问题,我们需要实现图片的异步加载,并且通常会结合三级缓存机制来优化性能。本文将详细讲解如何在ListView中实现异步加载图片...

Global site tag (gtag.js) - Google Analytics