Android主流图片加载比较

主要参考 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);

Glide和Picasso的区别

四. 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不同出处

Picasso和Glide众多Api相似,主要的不同体现在缓存策略上:

Picasso 和 Glide 在磁盘缓存策略上有很大的不同。Picasso 缓存的是全尺寸的,而 Glide 缓存的是跟 ImageView 尺寸相同的。我们可以将 ImageView 调整成不同大小,但不管大小如何 Picasso 只缓存一个全尺寸的。Glide 则不同,它会为每种大小的 ImageView 缓存 一次。尽管一张图片已经缓存了一次,但是假如你要在另外一个地方再次以不同尺寸显示,需要重新下载,调整成新尺寸的大小,然后将这个尺寸的也缓存起来。

你可以通过代码改变这种行为,让Glide既缓存全尺寸又缓存其他尺寸,这样就使得下次在任何 ImageView 中加载图片的时候,全尺寸的图片将从缓存中取出,重新调整大小,然后缓存。

Glide 可以加载 GIF 动态图,而 Picasso 不能,但是 Glide 动画会消费太多的内存, Glide 比 Picasso 需要更大的空间来缓存。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,948评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,371评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,490评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,521评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,627评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,842评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,997评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,741评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,203评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,534评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,673评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,339评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,955评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,770评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,000评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,394评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,562评论 2 349

推荐阅读更多精彩内容