开源框架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
- 开源框架KImageLoader开发及原理剖析(一)
- 开源框架KImageLoader开发及原理剖析(二)
- CodeIgniter开源框架剖析(一)
- 微信小程序剖析 | 运行机制及框架原理
- Muduo库的框架剖析及总结(一)
- MFC框架剖析(一)
- RPC框架原理剖析(含实例)
- 传智播客——struts框架原理及应用(一)
- 《深入解析Android:Telephony原理剖析及最佳实践》一书即将发行,欢迎各位Android开发、爱好者订阅
- 剖析SSH核心原理(一)
- 剖析SSH核心原理(一) .
- 剖析SSH核心原理(一)
- 深入剖析 mybatis 原理(一)
- Mina2.0框架源码剖析(一)
- Mina2.0框架源码剖析(一)
- Mina2.0框架源码剖析(一)
- 深入剖析WTL框架(一)
- spring源码剖析(一)整体 框架
- Avro介绍
- Consistent Hashing一致性哈希库libconhash的使用与实现
- c++异常处理
- 解决jetty运行时,出现A full JDK (not just JRE) is required问题
- CSS position 属性:绝对定位与相对定位,以及浮动
- 开源框架KImageLoader开发及原理剖析(一)
- git原始源代码编译
- 在文本之前插入元素(用于微博或者论坛发表言论在之前显示的)
- 01、cocos2d简介
- 搭建spring、struts、jpa(hibernate)、ibatis框架详解
- 4、函数
- Python多进程(multiprocessing)一
- 如何设置button只能点击一次
- BIOS详解