详解ListView加载网络图片的优化,让你轻松掌握!

写博客辛苦了,转载的朋友请标明出处哦,,finddreams()

最近身边很多的人在问ListView加载网络图片该如何防止OOM,对于初学者来说ListView虽然平常用的比较多,但大多不知道该如何进行优化。同时,在面试的过程中ListView的优化问题也是最常会被问到的,以前面试中要是你能说出优化ListView的几个方法,那基本上面试官可能就会认可你的能力了。

我们来了解一些ListView在加载大量网络图片的时候存在的常见问题:

1.性能问题,ListView的滑动有卡顿,不流畅,造成非常糟糕的用户体验。

2.图片的错位问题。

3.图片太大,加载Bitmap时造成的OOM(Outofmemory),也就是栈内存溢出。

4.异步线程丢失的问题。

针对所存在的问题我们逐个击破,彻底的掌握ListView的优化问题,有利于我们的学习和工作。

(一)性能问题:

在这个问题上我们可以在Adapter适配器中中复用convertView和写一个内部ViewHolder类来解决。但是如果每个Adapter中都写一个ViewHolder类会显得非常的麻烦,下面我给大家一个万能的ViewHolder类,方便在任何Adapter中调用。

public class BaseViewHolder {@SuppressWarnings("unchecked")public static <T extends View> T get(View view, int id) {SparseArray<View> viewHolder = (SparseArray<View>) view.getTag();if (viewHolder == null) {viewHolder = new SparseArray<View>();view.setTag(viewHolder);}View childView = viewHolder.get(id);if (childView == null) {childView = view.findViewById(id);viewHolder.put(id, childView);}return (T) childView;}}

调用BaseViewHolder类的示例代码:

if (convertView == null) {convertView = LayoutInflater.from(context).inflate(R.layout.personplans_item, parent, false);}TextView tv_product_type1 = BaseViewHolder.get(convertView,R.id.tv_product_type1);

注意:在BaseViewHolder类中我们看到SparseArray是Android提供的一个工具类,用意是用来取代HashMap工具类的。如下图:

SparseArray是android里为<Interger,Object>这样的Hashmap而专门写的类,目的是提高效率。具体如何提高效率可以去Android文档查询一下,这里就不赘述了。

(二)图片错位问题

这个问题导致的原因是因为复用ConvertView导致的,在加载大量的Item时,常见的错位问题。这种问题的解决思路通常是以图片的Url做为唯一的key,然后setTag中,然后获取时根据图片的URL来获得图片。

(三)防止OOM,以及异步加载。

关于异步加载图片的思路是:

1.第一次进入时,是没有图片的,这时候我们会启动一个线程池,异步的从网上获得图片数据,为了防止图片过大导致OOM,可以调用BitmapFactory中的Options类对图片进行适当的缩放,最后再显示主线程的ImageView上。

2.把加载好的图片以图片的Url做为唯一的key存入内存缓存当中,并严格的控制好这个缓存的大小,防止OOM的发生。

3.把图片缓存在SD当中,如果没有SD卡就放在系统的缓存目录cache中,以保证在APP退出后,下次进来能看到缓存中的图片,这样就可以让使你的APP不会给客户呈现一片空白的景象。

4.用户第二次进来的时候,加载图片的流程则是倒序的,首先从内容中看是否存在缓存图片,如果没有就从SD卡当中寻找,再没有然后才是从网络中获取图片数据。这样做的既可以提高加载图片的效率,同时也节约了用户的流量。

说完了理论性的东西,我们来开始动手实战一下吧,下面介绍一个GitHub上一个很轻巧的开源框架LazyListGitHub地址,然后基于它做一些我们想要的效果,关于开源的东西,我们不止要学会用,还要从中能学到东西。众所周知的Android-Universal-Image-Loader其实就是基于LazyList的一个拓展 ,增加了更多的配置。但是从学习的角度我们还是希望能从原理学起,太多的功能封装,难免会让我们晕乎,简单的功能实现就够了。

1.先来看一下运行效果图:

2.来看一下LazyList项目的结构:

昨晚多几分钟的准备,今天少几小时的麻烦。

详解ListView加载网络图片的优化,让你轻松掌握!

相关文章:

你感兴趣的文章:

标签云: