图片加载原理

1. imageloader在展示的时候将ImageView转换成ImageViewAware.
多线程下载图片,图片可以来源于网络,文件系统,项目文件夹assets中以及drawable中等
支持随意的配置ImageLoader,例如线程池,图片下载器,内存缓存策略,硬盘缓存策略,图片显示选项以及其他的一些配置
支持图片的内存缓存,文件系统缓存或者SD卡缓存
支持图片下载过程的监听
根据控件(ImageView)的大小对Bitmap进行裁剪,减少Bitmap占用过多的内存
较好的控制图片的加载过程,例如暂停图片加载,重新开始加载图片,一般使用在ListView,GridView中,滑动过程中暂停加载图片,停止滑动的时候去加载图片
提供在较慢的网络下对图片进行加载

该类主要是将ImageView进行一个包装,将ImageView的强引用变成弱引用,当内存不足的时候,可以更好的回收ImageView对象,还有就是获取ImageView的宽度和高度。这使得我们可以根据ImageView的宽高去对图片进行一个裁剪,减少内存的使用。
(1) ImageLoaderEngine中存在一个HashMap用来记录正在加载的任务
(2)加载图片的时候会将ImageView的id和图片的url加上尺寸加入到HashMap中,
(3)加载完成之后会将其移除,然后将DisplayImageOptions的imageResForEmptyUri的图片设置给ImageView,
(4)最后回调给ImageLoadingListener接口告诉它这次任务完成了。

2.加载图片:
如果图片不在内存缓存, 那么就从文件或者网络去加载图片. 将LoadAndDisplayImageTask加入到线程池.
有几种情况是不用显示的
第一种:拖动, 或者猛的滑动的时候
第二种:判断imageview是不是被垃圾回收器回收了
第三种:imageview是不是被复用了
第四种:每个URL对应一个锁, 应对这样一个场景, 多次频繁滚动, 来显示同一张图片的时候, 会造成频繁访问, 有锁的话, 就只会用一次的访问结果.

3.下载图片
先从文件缓存中获取图片,
有的话, 直接decode, 然后根据imageview的宽和高进行剪裁
没有的话, 从服务器上拉取图片保存到本地文件中,下载过程中调用了,进度回调的listener.
下载完, 如果设置了maxImageWidthForDiskCache和maxImageHeightForDiskCache,那么会按照这个尺寸进行剪裁和保存.
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值