开源框架KImageLoader开发及原理剖析(一)
2016-01-17 17:53
253 查看
Android中有不少关于图片加载的开源框架,比如著名的Android-Universal-Image-Loader,最近在项目中也需要加载图片,然后就去用了UIL,结果发现有许多功能UIL并没有提供,虽然可以通过某些方法勉强满足需求,但是到后面就会发现,项目越来越难维护和扩展了,因此自己就写了一个图片加载的框架KImageLoader。
有时会遇到同时将一个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.类及方法数量少,架构简单,容易使用。
转载请注明原文地址:http://blog.csdn.net/u012619640/article/details/50532888
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
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories