开源框架KImageLoader开发及原理剖析(一)

来源:互联网 发布:传说中的梨绯数据 编辑:程序博客网 时间:2024/05/02 17:52

Android中有不少关于图片加载的开源框架,比如著名的Android-Universal-Image-Loader,最近在项目中也需要加载图片,然后就去用了UIL,结果发现有许多功能UIL并没有提供,虽然可以通过某些方法勉强满足需求,但是到后面就会发现,项目越来越难维护和扩展了,因此自己就写了一个图片加载的框架KImageLoader。

KImageLoader开源框架Github地址:https://github.com/dolpphins/KImageLoader

一、KImageLoader功能及特点

1.既可以实现一对一加载,也可以实现一对多加载模式(即一个url对应多个ImageView)
有时会遇到同时将一个url对应的图片加载显示到多个ImageView上的需求,比如在优化流量时如果多个ImageView要显示的图片的url都是同一个,那么就可以把它们合并为一个请求以节省流量。UIL并没有为此提供直接的API,它的displayImage方法接收的都是一个ImageView对象,当然我们可以通过监听器自行扩展实现该需求。而KImageLoader的displayImage方法既可以接收单个ImageView对象,也可以接收一个ImageView集合。

2.可以指定是否自动创建磁盘缓存目录
在磁盘缓存目录不存在的情况下可以指定是否自动创建目录,这个可以简化外部程序代码。

3.可以指定从特定的源加载图片
比如我们可以指定只从内存缓存和磁盘缓存中加载图片,如果没有就直接返回,而不是进一步通过网络去获取图片。这个功能的一个使用场景就是在ListView快速滑动优化时可能会用到,ListView快速滑动时,滑过的Item的getView方法都会被调用,但我们并不会去加载相应的图片,不过如果什么都不加载是有问题的,由于ListView的View复用机制,用户会看到滑过的Item的图片显示的是上一次该View被使用时的图片,这显然是不对的,当然我们可以一律擦除设置为默认图片,但这样用户体验不好。因此我们可以采取这种策略:快速滑动ListView,从内存缓存中读取图片(或者进一步从磁盘缓存中读),如果没有就直接返回,等到列表停止滑动才真正去加载图片,这样用户体验会好很多。

4.可以指定加载的图片的质量,包括从网络上获取
有时服务器上的图片比较大,但实际上我们的手机分辨率并不高,此时直接加载原图肯定不行,不仅会浪费用户流量,而且还会延长图片加载时间,甚至会导致OOM。这时我们就可以通过计算加载指定质量的图片就行。当然这个问题的解决方法也可以是服务端计算返回相应的图片。

5.会自动识别本地文件系统的图片路径,因此可以跟加载网络图片一样加载本地文件系统上的图片。
UIL并不能直接加载一个本地图片文件路径,而需要指定相应的协议,这也使得代码变得更加复杂,而KImageLoader可以直接加载一个本地图片文件路径的图片。

6.可以设置获取图像线程优先级。
有时我们需要设置某些图片先加载,加载完再去加载其它图片,这时就需要指定其加载图片线程的优先级,KImageLoader中使用了PriorityBlockingQueue作为图片加载线程队列,因此可以通过设置任务的优先级来指定其图片加载线程的优先既,默认情况下所有图片加载线程的优先级都是相同的。

7.类及方法数量少,架构简单,容易使用。

二、使用KImageLoader

使用方法基本和UIL一样,代码中包含了所有支持配置和图片加载选项。

imageLoader = ImageLoader.getInstance();        ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder()                        .setDiskCacheMaxSize(2 * 1024 * 1024 * 1024L) //磁盘缓存大小                        .setDiskCachePath("/sdcard/KImageLoader") //磁盘缓存目录                        .isAutoCreateCacheDir(true) //磁盘缓存目不存在时是否自动创建录,默认为false                        .build();        imageLoader.setImageLoaderConfiguration(config);        ImageLoaderOptions opts = new ImageLoaderOptions.Builder()                .cacheInMemory(true) //允许内存缓存                .cacheInDisk(true)   //允许磁盘缓存                .setLoadingDrawableId(R.drawable.ic_launcher) //加载图片时显示的图片                .setLoadedfailDrawableId(R.drawable.image_emoticon10) //加载图片失败显示的图片                .loadFromMemory(false) //是否允许从内存缓存中读取                .loadFromDisk(false)   //是否允许从磁盘缓存中读取                .loadFromNetwork(true) //是否允许通过网络加载图片                .setBitmapOptions(null) //指定要加载的图片的质量等                .build();        String url = "http://img2.imgtn.bdimg.com/it/u=2702123953,998736265&fm=21&gp=0.jpg";        ImageView imageView = (ImageView) findViewById(R.id.iv);        imageLoader.displayImage(getApplicationContext(), url, imageView, opts);

转载请注明原文地址:http://blog.csdn.net/u012619640/article/details/50532888

0 0