Android技术积累:图片异步加载
2013-05-31 13:39
183 查看
本文链接地址:http://keegan-lee.diandian.com/post/2012-12-14/40046198902
当在ListView或GridView中要加载很多图片时,很容易出现滑动时的卡顿现象,以及出现OOM导致FC(Force Close)。
会出现卡顿现象主要是因为加载数据慢,要等数据加载完才能显示出来。可以通过将数据分页显示,以及将耗时的图片加载用异步的方式和图片缓存,这样就可以解决卡顿的问题。
大部分开发者在ListView或GridView加载图片时,都会在getView方法里创建新的线程去异步加载图片。然而,当屏幕快速向下滑动时,每个划过的Item都会调用getView一次,即会创建出很多线程,同一时间存在的线程太多,内存不够用了,自然就会OOM了。要避免OOM,就得控制好线程的数量,所以加个线程池就非常有必要了。
另外,当向下快速滑动屏幕时,也没必要加载滑动过的所有图片,只要加载滑动停止后当前屏幕的就足够了。仔细观察像微博、facebook或其他优秀的app,滑动屏幕时未加载过的图片是不会被加载的,当滑动停止后,也只加载当前屏幕内的图片。
那么,接下来就讨论实现的问题了。首先,图片是需要缓存的,前一篇文章已经对图片缓存做了总结(Android技术积累:图片缓存管理),直接拿过来用就行。然后,线程池维护多少个线程比较合适呢?这个很难界定,线程太少CPU不能得到充分利用,线程太多会降低性能,也加大了OOM的风险。线程池的最佳大小取决于可用处理器的数目以及工作队列中的任务的性质。若在一个具有N个处理器的系统上只有一个工作队列,其中全部是计算性质的任务,在线程池具有N或N+1个线程时一般会获得最大的CPU利用率。
建立线程池的代码如下:
直接看图片加载的工具类ImageLoader的完整代码:
异步加载图片,关键就在于三点:1、缓存;2、线程池;3、只加载当前屏幕
相关文章推荐
- Android技术积累:图片异步加载
- (转)Android技术积累:图片异步加载
- Android技术积累:图片异步加载
- Android技术积累:图片异步加载
- Android技术积累:图片异步加载
- Android技术积累:图片异步加载
- android-------用双缓存技术优化listview异步加载网络图片
- Android 异步加载图片,使用LruCache和SD卡或手机缓存,效果非常的流畅
- Android——异步加载图片
- Android 使用BaseAdapter实现异步图片加载
- 图片加载Android--ListView异步加载图片
- Android异步图片加载组件之 Universal_image_loader
- Android:ViewPager扩展的具体解释——导航ViewPagerIndicator(有图片缓存,异步加载图片)
- Android-Universal-Image-Loader 图片异步加载类库的使用
- android listview分页异步加载图片及图片缓存
- Android图片异步加载框架Android-Universal-Image-Loader
- Android之ListView异步加载网络图片(优化缓存机制)【转】
- 演化理解 Android 异步加载图片
- Android图片异步加载一之传统的handler+runnable模式
- android中异步加载网络图片