ImageLoader的设计(1) - Android-Universal-Image-Loader

##ImageLoader解决的问题

分析源码之前我们需要知道ImageLoader为什么要出现,或者说ImageLoader是用来解决什么问题的。总结了一下几点:

  • 对于加载网络的图片是比较耗时的,而对于耗时的排序基本是 网络>磁盘>内存,因此我们需要尽量减少对于网络的请求次数,我们可以牺牲磁盘和内存来达到尽量减少网络请求的加载,这就是我们所说的三级缓存,先从内存获取,然后从磁盘获取,最后再从网络获取。所以ImageLoader需要对此问题给出解决方案。
  • 图片本身会占用大量的内存,如何做到内存的优化?ImageLoader需要对此问题给出解决方案,基本的解决方案是
    • 图片的大小压缩,对应于Bitmap就是其大小
    • 图片的色彩压缩,对应于Bitmap就是像素的标识是565还是8888
  • 对于加载图片需要在子线程中运行,如何合理的处理线程需要考虑
  • 扩展性,对于此问题不实现也可以,但写出来的代码绝对不是好代码,因为无法扩展
    • 显示的时候,对返回的Bitmap做处理,比如说我们需要倒圆角,圆形图,那ImageLoader是否可以给予支持,给用户更好的使用。(ImageLoader可以不给予实现,但是此实现会极大的提高ImageLoader的易用性)。
    • 对于图片的加载,我们需要从网络加载,也可以从磁盘加载,而且网络加载是否可以引入其他的库比如HttpClient等等。如何做到这些呢?ImageLoader最好给予实现。
  • 易用性,既然是库,给client使用时候就需要考虑

Android-Universal-Image-Loader为例

Android-Universal-Image-Loader流程
流程

ImageLoder对外充当高层接口,ImageLoaderEngine管理线程,而ImageDecoder和ImageDownloader用于加载图片,而BitmapDisplayer用于显示Bitmap到ImageView上。

对外接口结构
对外接口

供客户端接口是通过Facade模式进行封装,把底层细节隐藏起来,提供给用户使用的是ImageLoader类和ImageLoaderConfiguraton类。客户端不需要涉及底层细节,提高易用性。

##源码分析

下面以ImageLoader的displayImage为例,看看如何从网络获取图片,如何把图片设置到ImageView上。

    public void displayImage(String uri, ImageAware imageAware, DisplayImageOptions options,
          ImageSize targetSize, ImageLoadingListener listener, ImageLoadingProgressListener progressListener) {
     ......
       // 获取控件大小,后面我们需要根据此来压缩图片
       if (targetSize == null) {
          targetSize = ImageSizeUtils.defineTargetSizeForView(imageAware, configuration.getMaxImageSize());
       }
      // 根据Uri生成一个key,这个key非常重要,在ListView中itemView复用的时候通过key识别
       String memoryCacheKey = MemoryCacheUtils.generateKey(uri, targetSize);
       engine.prepareDisplayTaskFor(imageAware, memoryCacheKey);
    
      //现在先从memory中看是否能获取到。
       Bitmap bmp = configuration.memoryCache.get(memoryCacheKey);
       if (bmp != null && !bmp.isRecycled()) {
          // 这里是可以获取到Bitmap的代码,把Bitmap展示到ImageView中,可以查看Imag
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值