glide

作者: zzyytt | 来源:发表于2017-03-19 22:45 被阅读0次

    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。

    相关文章

      网友评论

          本文标题:glide

          本文链接:https://www.haomeiwen.com/subject/nhgvnttx.html