1、github官网: https://github.com/bumptech/glide 2、概念 http://www.jianshu.com/p/b160e8a0d88e 结合github官网的介绍 简单总结下 1、谷歌推荐使用 2、一个 android 平台上的快速和高效的开源的多媒体资源管理库,提供 多媒体文件的压缩,内存和磁盘缓存, 资源池的接口。 3、可以最大性能地在 Android 设备上读取、解码、显示图片和视频。 4、可以将远程的图片、视频、动画图片等缓存在设备本地,便于提高用户浏览图片的流畅体验。 5、网址下边有特点介绍 或者想下面网址一样简单总结 http://www.jianshu.com/p/5d156bdee68b Glide是一个Android高性能媒体框架。支持图片、Gif、原生视频的加载。使用简单,可扩展性强,性能优异,Google推荐使用。 3、优势 1、Universal Image Loader,Volley,Picasso、Fresco、Glide比较 http://www.jianshu.com/p/239df3b480d0(简明扼要,特别是图片左边的总结) http://blog.csdn.net/richiezhu/article/details/46968569/(最下边有做总结) 2、Gilde、Picasso、Fresco http://www.jianshu.com/p/48311f567969(总结的非常全面到位) http://www.jianshu.com/p/6d5ddfc4eabb http://www.jianshu.com/p/061d5ab2f9d2 http://www.jianshu.com/p/4ed015142857 简单总结下 1、先比较Glide和Picasso 1、总体来讲 二者极为相似,有着近乎相同的API的使用风格,但Glide在缓存策略和加载gif方面略胜一筹。2、Glide的with方法不光接受Context,还接受Activity和Fragment。 图片加载会和Activity/Fragment的生命周期保持一致,所以推荐传参的时候传递Activity和Fragment给Glide,而不是Context。3、默认加在格式 普通情况下,Glide加载的图片质量要差于Picasso。 这是因为Glide默认的Bitmap格式是RGB-565比ARGB-8888格式的内存开销要小一半。 想要提高Glide的图片效果,可以创建一个新的GlideModule将Bitmap格式转换到ARGB-8888。 同时在AndroidManifest.xml中将GlideModule定义为meta-data。4、内存消耗 Picasso内存开销大,原因在于Picasso加载了全尺寸的图片到内存,然后让GPU来实时重绘大小。 Glide加载的大小和ImageView的大小是一致的。 Picasso也是可以指定加载图片大小的,但是问题在于你需要主动计算ImageView的大小,或者说你的ImageView大小是具体的值(而不是wrap_content)5、缓存策略 Picasso缓存的是全尺寸的,Picasso只缓存一个全尺寸的 Glide缓存的是跟ImageView尺寸相同的,假如你要在另外一个地方再次以不同尺寸显示,需要重新下载,调整成新尺寸的大小,然后将这个尺寸的也缓存起来。 可以改变这种行为,看上面第四个网址6、gif Glide支持gif,Picasso不支持gif7、包的大小 Picasso (v2.5.1)的大小约118kb,而Glide (v3.5.2)的大小约430kb。 2、Fresco(重点看第二个网址) 1、最大特点在于它的内存管理 Fresco 会将图片放到一个特别的内存区域,3级缓存设计(2级内存,1级磁盘)2、渐进式呈现、动图加载gif等3、其他特点看第二个网址4、最大缺点,体积大 3、综合比较 各网址最后部分Glide在多方面都优于Picasso,特别是内存消耗、缓存策略、加载gif上,更快更流畅 Picasso比Glide体积小很多且图像质量比Glide高。Fresco是性能最好的,但体积太大,如果应用没有太多图片需求,不推荐使用Fresco。 4、使用 http://www.jianshu.com/p/8d0fb78659a9 其中提到了非常有用的几点 1、转换Transformations 开发中经常要将图片剪裁成圆角、圆形等 http://www.jianshu.com/p/976c86fa72bc(可以导入类似这样的图像转换开源库) 2、回调Targets 1、SimpleTarget转为Bitmap再根据需要处理
2、ViewTarget(重点)
可以将图片设置到任意View中,而不只局限于imageview,具体操作看网址
3、NotificationTarget
加载图片到 Notifications,看网址
3、用GlideModule自定义 Glide(重点)
看网址和约车看房
5、原理
6、源码
1、初次看,建议照着下面的网址来看,按glide链式函数调用的顺序看
http://www.jianshu.com/p/0789b82b3f80
2、总体流程
http://www.jianshu.com/p/adada3a6e117(开头图解整体流程)
http://www.jianshu.com/p/03d536c43936(最后总结整体流程)
3、专题的解析
http://www.jianshu.com/p/c7746ffed0c7(图片加载的生命周期)
http://www.jianshu.com/p/87a75044a174(如何动态测量获取ImageView大小)
自己总结:
1、首先通过Glide.with方法生成RequestManager对象来管理请求
可以传入Activity、Fragment、Context类型的参数,里面会用到ActivityFragmentLifecycle接口(新建一个不显示的Fragment,在里面有此接口)
来实现图片加载与Activity或Fragment生命周期一样。
另外,RequestManager对象的生成也会调用Glide.get()方法(双重校验的单例模式),Glide.get()方法中有对设置的GlideModule的获取,并应用里面的配置。
2、然后调用RequestManager.load方法得到相应的RequestBuilder对象
可以传入多种类型参数,比如图片url,本地资源文件,File文件等
3、通过Builder建造者模式不断给RequestBuilder添加条件,
比如裁剪,优先级,占位图,缓存策略等等
4、通过into方法传入目的target,并开启请求
5、查看目标View的tag中获取看看是否有request,如果有则清除。然后用新建的request来覆盖。
6、执行request,三级缓存策略,先看缓存中是否存在EngineResource(通过LruResourceCache来实现),再看是否有EngineResource的若引用,
最后看Map中是否存在EngineJob。如果有则直接返回结果并进行相应加载
7、new并执行EngineRunnable这个DecoderJob的封装
EngineJob管理两个线程池,一个磁盘线程池,一个资源线程池,先从磁盘获取,磁盘没有再从其他地方获取。
8、在DecoderJob内部查看是否存在相应的InputStream或者是ParcelFileDescriptor,如果已经存在,则直接将其通过loadProviderdecode成相应的Bitmap,gif等。
否则就通过fetcher先将我们通过load传入的路径进行解析成InputStream、ParcelFileDescriptor,再decode。
网友评论