android Gridview图片异步加载的要领

wgrd5626 8年前

关于GridView或者是ListView异步加载图片的文章数不胜数,总结起来就是:

1.高效率的缓存机制(文件缓存和LruCache并用)

2.图片的压缩方式,尽可能节省内存

3.UI刷新的频率

   其中第三点,UI刷新的频率指的是在滑动过程中,当图片加载完,ImageView都会有setImageBitmap这种更新UI的事件,如果在同一时间内有好几个线程同时完成图片的加载,由于是在滚动过程中,会造成轻微的卡顿。

   解决的办法一般是在滑动的时候暂停加载,当滑动停止再继续完成加载,或者是滑动比较快的时候暂停加载,滑动慢下来了再去加载,我比较喜欢第二种,不过你需要得到这个滑动速度,如何获得请看这篇文章:

如何获得ListView当前的滚动速度

   但是还有一点被忽略的是开启的线程数目其实也会影响到这个流畅度,线程数目并不是越多越好,如果一下子开启了50个线程,那么这50个线程如果完成时间差别不大,也会导致UI刷新频率过高。一般我们使用线程池来管理线程的数目。过多的线程数目不仅会直接导致cpu负载过高,还会因为UI刷新频繁影响UI线程的流畅性。

   实际上,一般线程池的数目在小于5比较合适,而且我还发现如果线程数目在3以下,上面提到的滑动比较快的时候去暂停加载这个方案是可以弃用的,因为线程数目较少(比如线程池大小为2),滑动再快同时也只会刷新两张图片。所以最好的解决方案是采用容量较小的线程池,同时不再考虑滚动(或者滚动过快)时是否加载的问题,如果你还是一定要考虑,那暂停加载的时机也最好是速度较大的时候。总之在线程池数目与暂停加载之间找到一个平衡点吧。