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 的性能优化是一个复杂的问题,需要从多方面入手,包括 Adapter 的优化、视图缓存、数据加载优化等。通过使用 convertView 机制和 ViewHolder 模式,可以大幅度提高 ListView 的性能。同时,我们还需要注意...
本篇将深入探讨如何对ListView进行优化,以及如何实现图片的异步加载和缓存策略,以避免这些问题。 **1. ListView优化** ListView的优化主要涉及以下几个方面: 1.1 **convertView复用机制**:ListView的Adapter...
然而,在实现ListView时,由于其内部机制,可能会出现一个问题,即ListView中的item(列表项)重用导致图片重复加载,这不仅会消耗不必要的网络资源,还可能影响用户体验。本文将深入探讨这个问题,并提供解决方案。...
总之,ListView加载多幅图片涉及到ImageList的使用,图片的加载和存储策略,以及性能优化。通过合理的编程实践,可以创建出流畅且高效的图片展示效果。同时,理解并掌握这些知识点对于开发高质量的UI界面至关重要。
首先,ViewHolder模式是ListView性能优化的基础。这个模式的主要目的是减少对视图的查找和更新操作,通过复用已创建的视图来避免每次滚动时创建新的视图对象。在`getView()`方法中,我们首先检查convertView是否为...
1. **ViewHolder模式**:这是ListView性能优化的核心。通过复用已创建的视图,避免频繁的findViewById操作,减少内存分配,提升列表滑动的流畅性。在getView方法中,通过convertView参数检查并重用已存在的视图,而...
在实际项目中,还应考虑优化ListView的滚动性能,如使用ViewHolder模式减少视图查找的开销,以及根据ListView的可见区域动态加载或取消加载图片,避免一次性加载过多图片导致内存压力过大。这些技巧与异步加载图片...
然而,当ListView中的每一项包含网络图片时,会遇到一些挑战,比如图片加载错位、错乱等问题。这些问题主要源于ListView的重用机制和图片加载的延迟。针对这些问题,我们可以采用缓存机制和第三方库如xutil来优化...
然而,如果不进行适当的优化,ListView可能会导致性能问题,甚至触发内存溢出(OOM)异常,尤其是在加载图片时。本篇将深入探讨ListView的优化策略以及如何避免在加载图片时出现内存溢出。 1. **ListView优化策略**...
因此,对ListView进行性能优化至关重要。本文将详细介绍几个关键的优化策略。 1. 使用ViewHolder模式 ViewHolder模式是ListView优化的核心技巧,它可以避免在滚动时频繁地创建和查找视图对象。通过创建一个...
7. **结合RecycleView**:尽管ListView是经典的列表控件,但现在更推荐使用RecycleView,因为它提供了更多的自定义选项和性能优化。 8. **使用 Fresco 图片加载库**:Fresco 是 Facebook 开源的一个强大的图片加载...
10. **总结**:在Android的ListView中实现异步加载网络图片,需要结合异步处理框架、选择合适的图片库、优化缓存策略、合理管理内存,并对ListView进行优化。通过这些手段,可以显著提升应用的性能和用户体验。
然后,我们谈谈**LruCache**(Least Recently Used Cache)在图片加载中的作用。LruCache是Android提供的一个基于最近最少使用原则的内存缓存策略。通过将图片数据存储在内存中,可以快速访问已加载过的图片,减少...
以上就是从MySQL加载数据并在Android ListView中显示的整个流程,涵盖了前后端的交互以及客户端的性能优化。这个过程中需要注意各个环节的协同工作,以实现高效、稳定且用户友好的数据和图片加载体验。
综上所述,Android ListView中异步加载图片是优化用户体验的关键。通过选择合适的异步加载策略和处理图片错位问题,我们可以确保ListView流畅运行,提供优质的用户体验。同时,利用第三方库可以大大简化代码,提高...
在描述中提到,提供的代码资源可以解决大部分开发者遇到的头疼问题,即如何优化ListView的图片加载。通常,直接从网络加载图片会消耗大量的内存和CPU资源,导致应用卡顿,甚至崩溃。为了解决这个问题,开发者需要...
然而,如果不进行适当的优化,ListView可能会遇到性能问题,比如滚动不流畅、内存泄漏等。本攻略将深入探讨ListView的优化策略以及异步加载技术,以确保用户体验的顺畅。 一、ListView的基本优化 1. 使用...
这篇博客“ListView性能优化系列之一”着重探讨了如何通过深入理解源码和利用特定工具来提升ListView的性能。 首先,了解ListView的工作原理是优化的基础。ListView采用的是滚动复用机制,即“视图回收”...
然而,如果直接在ListView中加载图片,可能会导致性能问题,比如滚动卡顿。为了解决这个问题,我们需要实现图片的异步加载,并且通常会结合三级缓存机制来优化性能。本文将详细讲解如何在ListView中实现异步加载图片...