Gilde,Picasso,Image-loader,Fresco图片加载库的使区别
Glide
Glide是一个非常成熟的图片加载库,他可以从多个源加载图片,如:网路,本地,Uri等,更重要的是他内部封装了非常好的缓存机制并且在处理图片的时候能保持一个低的内存消耗。
当我们调整imageview的大小时,Picasso会不管imageview大小是什么,总是直接缓存整张图片,而Glide就不一样了,它会为每个不同尺寸的Imageview缓存一张图片,也就是说不管你的这张图片有没有加载过,只要imageview的尺寸不一样,那么Glide就会重新加载一次,这时候,它会在加载的imageview之前从网络上重新下载,然后再缓存。
较之Picasso,Glide加载图片速度是非常快的。
另外,Glide拥有Picasso所不具备的加载GIF图的功能。
缺点:Glide的Bitmap默认的格式是RGB_565,而Picasso用的是ARGB_8888,所以虽然质量上不如Picasso(其实在手机上也不明显),但是RGB_565格式的图片仅仅消耗ARGB_8888格式图片一半的内存。
Picasso的库大小大约是118KB,而Glide大约有430KB。
With()方法
with()方法是Glide类中的一组静态方法,它有好几个方法重载
with()方法的重载种类非常多,既可以传入Activity,也可以传入Fragment或者是Context。每一个with()方法重载的代码都非常简单,都是先调用RequestManagerRetriever的静态get()方法得到一个RequestManagerRetriever对象,这个静态get()方法就是一个单例实现,然后再调用RequestManagerRetriever的实例get()方法,去获取RequestManager对象。
Glide 对每个 context 都保持一个 RequestManager,通过 FragmentTransaction 保持与 Activity/Fragment 生命周期一致,并且有对应的 trimMemory 接口实现可供调用。
内存友好:
① Glide 的内存缓存有个 active 的设计
从内存缓存中取数据时,不像一般的实现用 get,而是用 remove,再将这个缓存数据放到一个 value 为软引用的 activeResources map 中,并计数引用数,在图片加载完成后进行判断,如果引用计数为空则回收掉。
② 内存缓存更小图片
Glide 以 url、view_width、view_height、屏幕的分辨率等做为联合 key,将处理后的图片缓存在内存缓存中,而不是原始图片以节省大小
③ 与 Activity/Fragment 生命周期一致,支持 trimMemory
④ 图片默认使用默认 RGB_565 而不是 ARGB_888
虽然清晰度差些,但图片更小,也可配置到 ARGB_888。
Picasso
Picasso它自带统计监控的功能,就是在图片缓存的时候,可以监控图片的缓存命中率、已使用的内存大小、节省的流量等。它也可以设置优先级,先加载优先级高的图片,它可以通过监听你网络的变换来调整你的最大并发数,比如 wifi 最大并发为 4, 4g 为 3,3g 为 2。
Picasso自己没有实现本地缓存,交给了 Square 的另外一个网络库 okhttp 去实现,这样的好处是可以通过请求 Response Header 中的 Cache-Control 及 Expired 控制图片的过期时间。Picasso 比 Glide 体积小很多且图像质量比 Glide 高
Picasso在使用with()方法是时候里面只能传context
Imageloader
Imageloader可以多线程异步加载和显示图片(图片可以来源自网络,SD卡,assets文件夹,drawable文件夹(不能加载9patch),视频缩略图)。并且他可以给加载过程添加一个监听事件,可以用来暂停加载图片。它还可以根据自己的需求进行各种配置(比如配置一些线程池,图片下载器,内存缓存策略)。支持图片的内存缓存和SD卡缓存,并且在网络速度较慢的时候,还可以对图片进行加载并设置下载监听。
它有个不好的地方就是,它的作者在2015年年底后就不在进行维护了。
Fresco
Fresco是Facebook出品的一个图片加载库,它是迄今为止Android平台上最强大的图片加载库。
它相对于其他开源的第三方图片加载库,Fresco拥有更好的内存管理和强大的功能,基本上能满足所有的日常使用场景。并且它大大减少了OOM,对于OOM的问题,他没有在java层处理,Facebook另辟途径,在更底层的Native堆进行处理,Fresco将图片放到一个特别的内存区域叫Ashmem区,图片不在占用APP的内存,这个属于C++的地盘,所以能大大的减少OOM。
它有个缺点就是用法比较复杂,包更加庞大(2-3M),底层涉及了C++领域,想要读源码深入学习比较困难。在使用的时候,它需要用Fresco的组件SimpleDraweeView替换掉Android原生图片显示组件ImageView,这也是很多人不愿意在项目中接入Fresco的主要原因。
它支持静态图和动态图的加载。