主要参考 Trinea 的 http://www.trinea.cn/android/android-image-cache-compare/
总结学习 所引用的地址 侵权删
一. 四大图片缓存基本信息
目前主流的图片缓存框架
二.共同的优点
1. 使用简单
2. 可配置度高,自适应程度高(内部封装了关于下载,解码,显示,缓存,算法,CPU 核数确定最大并发数,根据可用内存确定内存缓存大小,网络状态变化时调整最大并发数等)
3. 至少两级缓存,提高加载速率
4. 支持多种数据源 本地 网络 assess等
5. 支持多种display 不仅支持imageview 还支持其他的view 等
其他小的共同点包括支持动画、支持 transform 处理、获取 EXIF 信息等。
三、设计优点以及用法
一. image-loader
1、imageloader 优点
1. 支持下载进度监听
2. 可以在view滚动中暂停图片加载 (通过pauseOnscrollListener接口可以在view滚动中暂停图片加载。)
3. 默认实现多种内存缓冲
4. 支持本地缓存文件名规则定义
2.imageloader用法
GitHub下载地址 https://github.com/nostra13/Android-Universal-Image-Loader
具体操作 http://blog.csdn.net/huangbiao86/article/details/22781701
单例模式 在application中创建配置图片的参数,直接使用
ImageLoader imageloader=Imageloader.getInstance();
imageloder.displayerImage(imagerUrl[position],holder.image,options,loadingListener);
二. Picasso
1、Picasso 优点
1. 自带统计监控功能
支持图片缓存使用的监控,包括缓存命中率,已使用内存大小,节省的流量等
2. 支持优先级处理
每次任务调度前会选择优先级高的任务,比如app页面的Banner的优先级高于Icon时很使用。
3. 支持延迟到图片尺寸计算完成加载
4. 支持飞行模式,并发线程根据网络类型而改变
这里Picasso 根据网络类型来决定最大并发数,而不是cpu核数。
5. "无"本地缓存
并不是说没有本地缓存,而是picasso没有实现,而是交给了super的okhttp实现,好处是可以通过请求Response Header的cache-control以及Expired控制图片的过期时间。
6. 使用复杂的图片压缩转换来尽可能的减少内存消耗
2.Picasso用法
极简 Picasso.with(context).load("http://i.imgur.com/DvpvklR.png").into(imageView);
泡网 大神
http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2014/0731/1639.html
1.adapter中取消已经不在视野总的imageview加载错位问题。
2.如果加载发生错误会重复三次请求,三次都失败才会显示erro Place holder
Picasso.with(context)
.load(url)
.placeholder(R.drawable.user_placeholder)
.error(R.drawable.user_placeholder_error)
.into(imageView);
3.存储的结构采用了LinkedHashMap ,采用lru算法
三.Glide
1、Glide优点
1. 图片缓存 ->媒体缓存
Glide不仅是一个图片缓存,而且支持Gif,WebP,缩略图
2. 支持优先级处理 (Picasso类似)
3. 与activity/Fragment生命周期一致,支持trimMemory(OnTrimMemory是Android 4.0之后提供的API,系统会根据不同的内存状态来回调。根据不同的内存状态,来响应不同的内存释放策略。)
Glide对每个Context都保持一个RequestManager ,通过FragmentTreansaction保持和activity/fragment生命周期一致,并且有相应的trimMemory接口可以实现。
4. 支持okhttp,Volley
Glide默认通过UrlConnetion获取数据,可以配合Okhttp,volley使用,实际imageloader,picasso都支持okhttp,volley。
5. 内存友好
1>.Glide的内存缓存有个activie的设计
从内存缓存中取数据时,不像一般的实现用get,而是remove,再把这个缓存数据放到一个value为软引用的activeResurces map中,并计数引用数,在图片加载完成后进行判断,如果引用数为空,则回收掉。
2>.内存缓存更小的图片。
Glide以url, view_width,view_height,屏幕分辨率等作为联合的Key,将处理后的图片缓存在内存缓存中,而不是原始图片以节省大小。
3>. 图片默认使用 RGB_565 而不是ARGB_888, 清晰度差,但是图片更小。也可以配置888
2.Glide用法
Glide.with(context)
.load("http://inthecheesefactory.com/uploads/source/glidepicasso/cover.jpg")
.into(ivImg);
四. fresco
Fresco 支持 Android2.3(API level 9) 及其以上系统。
1、fresco优点
1. 图片的渐进式呈现
渐进式的jepg图片格式先呈现大致的图片轮廓,然后随着图片的下载的继续,呈现逐渐清晰的图片,这对于移动设备,尤其是慢网络有很大的好处,有着更好的用户体验。
Android中的每个App的Java堆内存大小都是被严格控制的,每个对象都是使用Java的new在堆内存实例化,这是内存中相对安全的一块区域,内存有垃圾回收机制,App不在内存时,系统会自动回收内存。当内存进行垃圾回收机制时,还把Android应用完全终止了,也是使用App最常见的卡顿或假死的原因之一。
Ashmem Android 在操作Ashmem堆时,会把该堆中存有数据的内存区域从Ashmem对中抽取出来,而不是把它释放掉,这是一种弱内存释放模式; 被抽取出来的这部分内存只有当系统真正需要更多的内存那时候才会被释放,当Android把被抽取出来的这部分内存放回Ashmem堆,只是被抽取的内存空间没有被释放,之前的数据就被回复到相应的位置。
1. Android本身的图片不支持,但是Fresco支持。
2. Gif和WebP格式
3. 图片的呈现
*自定义各种焦点。
*圆角图
*下载失败之后,点击实现重新下载。
*自定义占位图,自定义overlay(轮廓图) ,或者进度条
4. 指定用户按压时的overlay。
5. 图像的加载
Fresco 的image pipeline设计,允许用户多方便控制图片的加载。
*为同一个图片指定不同的远程路径,或者使用已经存在本地缓存中的图片
*先显示一个低解析度的图片,等高清图下载完再显示高清图。
*加载完成回调通知
*对于本地图,如有EXIF缩略图,在大图加载完成前,先显示缩略图
*缩放旋转图片,处理已经下载的图片。
6. 相比较Glide,Picasso,Fresco体积较大。
2.Fresco用法
Github : https://github.com/facebook/fresco
官网文档:http://fresco-cn.org/docs/index.html
简单步骤:
1. application 中 初始化
Fresco.initialize(context);
2. 布局文件中 加入命名空间:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:fresco="http://schemas.android.com/apk/res-auto">
3. 加入SimpleDraweeView:
<com.facebook.drawee.view.SimpleDraweeView android:id="@+id/my_image_view" android:layout_width="20dp" android:layout_height="20dp" fresco:placeholderImage="@drawable/my_drawable" />
4. Uri uri = Uri.parse("https://XXXX"); SimpleDraweeView draweeView = (SimpleDraweeView) findViewById(R.id.my_image_view); draweeView.setImageURI(uri);
Picasso和Glide众多Api相似,主要的不同体现在缓存策略上:
Picasso 和 Glide 在磁盘缓存策略上有很大的不同。Picasso 缓存的是全尺寸的,而 Glide 缓存的是跟 ImageView 尺寸相同的。我们可以将 ImageView 调整成不同大小,但不管大小如何 Picasso 只缓存一个全尺寸的。Glide 则不同,它会为每种大小的 ImageView 缓存 一次。尽管一张图片已经缓存了一次,但是假如你要在另外一个地方再次以不同尺寸显示,需要重新下载,调整成新尺寸的大小,然后将这个尺寸的也缓存起来。
你可以通过代码改变这种行为,让Glide既缓存全尺寸又缓存其他尺寸,这样就使得下次在任何 ImageView 中加载图片的时候,全尺寸的图片将从缓存中取出,重新调整大小,然后缓存。
Glide 可以加载 GIF 动态图,而 Picasso 不能,但是 Glide 动画会消费太多的内存, Glide 比 Picasso 需要更大的空间来缓存。