ImageLoader学习笔记一

大家好,休息了几天之后,还是要回来继续学习的。今天将开始另一种Android开发常用框架的学习。由于本人公司使用的是ImageLoader的图片加载框架,所以接下来就是ImageLoader框架的学习笔记。希望这一系列学习结束之后,能够熟练掌握ImageLoader图片框架的整体知识。好了,接下来开始进入正题。

由于是学习笔记,就是博主在学习网上的文章的时候进行的学习记录,同时会有一些自己的思考和总结。这里同样附上原文作者的连接,大家想深入学习的话还是去拜读原文。 Android 开源框架Universal-Image-Loader完全解析(一)--- 基本介绍及使用


ImageLoader是什么呢?用过的人肯定多少都能说出一点来,但是一旦面试官问的比较深,比如是如何实现的之类的,就是比较深入的考察你对框架的理解了。像博主就是虽然每天都在使用,但是被细问的话就答不上来。

现在说起图片加载框架,比较主流的是Glide,picasso和ImageLoader。ImageLoader相比于另外两个,算是比较老牌的框架了。在一些新的项目中,可能更多的还是选择了Glide等等。但谁让自己项目用的是它呢,还是要把他搞明白。

首先让我们看看ImageLoader有哪些有点吧。ImageLoader全名Universal-ImageLoader。它具有一下特征。

1 多线程下载图片,图片可以来源于网络,文件系统,项目文件夹assets中以及drawable中等。

2 支持随意配置ImageLoader,例如线程池,图片下载器,内存缓存策略,硬盘缓存策略,图片图片显示选项以及其它的一些配置。

3 支持图片的内存缓存,文件系统缓存或者SD卡缓存。

4 支持图片下载过程的监听

5 根据控件(ImageView)的大下对Bitmap进行裁剪,减少Bitmap占用过多的内存。

扫描二维码关注公众号,回复: 1215229 查看本文章

6 较好的控件图片的加载过程,例如暂停图片加载,重新开始加载图片,一般使用ListView,GridView滑动过程中暂停加载图片,停止滑动后去加载图片。

7 提供在较慢网络下对图片进行加载


这里列举的可能不全,不过都是一些比较常见的,接下来看看ImageLoader的使用


在代码中创建一个ImageLoaderConfiguration。ImageLoaderConfiguration是图片加载器ImageLoader的配置参数,使用了建造者模式,这里 是直接使用createDefault方法创建了一个默认的ImageLoaderConfiguration,当然我们还可以自己设置ImageLoaderConfiguration。

在自己设置Configuration选项时,通过new ImageLoaderConfiguration.Builder(context).xxx等链式操作来配置自己需要的选项。

之后使用ImageLoader.getInstance().init(configuration)方法来导入配置。

由于是图片加载器,所以不要忘记在Manifest文件中添加网络权限。

接下来,在布局中建立一个ImageView,然后就可以使用ImageLoader来加载图片了。

ImageLoader加载图片的方法主要有以下几个。displayImage(), loadImage(),loadImageSync(),loadImageSync方法时同步的,android 4.0有个特性,网络操作不能在主线程,所以loadImageSync方法我们就不再使用

首先,使用loadImage方法来加载图片。

主要代码为ImageLoader.getInstance().loadImage(imageUrl,new ImageLoaderListener(){});

传入图片的url和imageLoaderListener。监听器中有四个方法,分别是onLoadingStarted, onLoadingFailed, onLoadingComplete, onLoadingCancel.

从英文单词上就可以看出这四个方法大概是代表什么了。分别代表下载开始时,失败时,完成时,以及取消时。我们如果有想要进行的操作,就可以在这四个时机下进行我们要的操作。如项目中就有的地方在完成时对图片进行剪裁,或者对ImageView的显示方式做设置。总之很灵活。

另外,如果嫌imageLoaderListener太复杂,这里还有一个简单版的监听器,SimpleImageLoadingListener,该类提供了ImageLoaderListener接口方法的空实现。使用的是缺省的适配器。


如果要指定图片大小怎么办?初始化一个ImageSize对象,指定图片的宽和高。

ImageSize mImageSize = new ImageSize(100,100);

之后在使用loadImage方法时,将imageSize作为第二个参数传进去。这也同时说明,loadImage方法有个三个参数调用方法。

在日常使用中,我们还会用到DisplayImageOptions,它可以配置一些图片显示的选项。比如图片在加载中ImageView显示的图片,是否需要使用内存缓存,是否需要使用文件缓存等等。配置方式同样的由DisplayImageOption.Builder().开始逐步使用链式操作添加。

生成了一个配置好的displayImageOption之后,我们同样需要在loadImage方法调用时将配置作为参数传进去。说明loadImage方法有多种参数入参的重载。



接下来看一下另外一种方法,displayImage加载图片。

使用方式如下。ImageLoader,getInstance().displayImage(imageUrl, mImageView,option);

参数为图片Url,图片展示控件imageView以及显示图片配置DisplayImageOption。

从方法使用来看,displayImage要比loadImage简单,它不需要监听器。而且它会根据控件大小和imageScaleType来自动剪裁图片。

我们在加载图片时,经常有需要显示图片下载进度的需求,UIL当然也提供了这样的功能。只需要在displayImage方法中传入imageLoadingProgressListener接口就可以了。

加载其它来源图片,使用UIL不仅可以加载网络图片,还可以加载SD卡图片,ContentProvider等,使用也很简单,只需要将图片的url稍加改变就行。

使用方法如下,建立显示配置option,建立图片路径String imagePath = "/mnt/sdcard/image.png";

建立url String imageUrl = Scheme.FILE.wrap(imagePath); 之后使用displayImage(imageUrl,mImageView,mOption);方法就能加载SD卡图片了。

在我们使用ListView GridView时,快速滑动列表时希望图片停止加载,在停止后,加载当前页面图片。这个框架也给我们提供了功能。

可以使用listView.setOnScrollListener(new PauseOnScrollListener(...))方法。

接下来,让我们看看有关OOM的问题。

虽然这个框架有很好的缓存机制,有效避免了OOM,但是并不保证OOM永远不会发生。如果我们在使用时经常发生OOM,我们该怎么做呢。

减少线程池中线程的个数,在ImageLoaderConfiguration中的.threadPoolSize中配置。

在DisplayImageOption选项中配置bitmapConfig为Bitmap.Config.RGB_565,因为默认是ARGB_8888,使用RGB_565会比ARGB_8888少消耗2倍内存。

在ImageLoaderConfiguration中配置图片的内存缓存为memoryCache(new WeakMemoryCche())或不使用。

在DisplayImageOption选项中设置imageScaleType(ImageScaleType.IN_SAMPLE_INT)或者imageScaleType(ImageScaleType.EXACTLY)

使用displayImage方法加载时,对ImageView对象使用的是弱引用,方便GC。而使用loiadImage方法时是将图片对象回调到监听器listener中的complete方法里,需要我们手动设置。


好了,第一篇的ImageLoader加载框架学习,我们就学习到这里。相信大家应该也有所了解。


简单地说,UIL为我们提供了两种加载图片的方法,loadImage和displayImage。一个需要监听器,一个不需要。同时,我们还可以在ImageLoaderConfiguration中进行加载器imageLoader的配置。在DisplayImageOption中对显示图片进行配置。另外,框架还给我们提供了列表滑动时暂停加载的监听器。以及对于OOM,我们应该做哪些操作来减少OOM。

第一篇就先到这里,后续的学习中,我们将从源码的角度来深入分析UIL框架。





猜你喜欢

转载自blog.csdn.net/kongou/article/details/75268629