引入Glide 在项目中引入Glide方式十分方便,首先在在project层级下的build.gradle添加如下内容: repositories { mavenCentral() google () } 其次在app层级下的build.gradle添加如下内容: dependencies { implementation 'com.github.bumptech.glide:glide 显示GIF Glide的强大之处在于除了加载图片之外,还可以加载GIF Glide.with(this).asGif().load(url).into(imageView); 如上代码即可展示GIF 图片转换 我们可以在Glide将图片加载到ImageView显示之前进行一些操作,比如实现圆角化、圆形化、模糊化等等,Glide内置了一些转换的API RequestOptions options = Glide还有很多使用方式,感兴趣的读者可以在github上去了解。
但Glide在缓存策略上,花费了很多心思,从而使得其在加载图片过程中,对内存的使用量非常小。 本文将分享Glide在缓存策略上使用的技巧。 Glide的策略是从源头上,区分正在显示和没有显示的Bitmap。Glide将内存分为两块儿:ActiveCache和MemoryCache。 监听生命周期 Glide.with(this).load("http://goo.gl/gEgYUd").into(imageView); 这是Glide的典型用法。 同理,Glide对于生命周期的监听也是采用了这种方式。 是Glide缓存策略的精妙之处。 如有问题,欢迎指正。
几乎所有的 OOM 错误都是因为宿主应用出了问题,而不是 Glide 本身。 升级到Glide4.0,使用asDrawable代替asBitmap,drawable更省内存。 onTrimMemory,调用 Glide.cleanMemroy() 清理掉所有的内存缓存。 使用它要比glide加载GIF效果效果要好,glide加载加载GIF图片CPU占用高,并且内存占用一直在增加。 glide, @NonNull Registry registry) { super.registerComponents(context, glide, registry);
1.用法及参考资料 参考资料:http://www.apkbus.com/blog-705730-60158.html 用法: Glide.with(this).load("https://timgsa.baidu.com return Glide.get(context).getRequestManagerRetriever();//-----------------------get函数中有对Glide的初始化initGlide glide = builder.build(applicationContext);//-----------------------------建造者模式生成glide 。。。。。。 Glide glide = Glide.get(context); applicationManager = factory.build(glide, new ApplicationLifecycle Glide glide = Glide.get(context); requestManager = factory.build(glide
Glide.with() public static RequestManager with(FragmentActivity activity) { //单例拿到一个RequestManagerRetriever RequestManagerTreeNode treeNode; private final RequestTracker requestTracker; private final Glide glide; private final OptionsApplier optionsApplier; private DefaultOptions options; //RequestManager lifecycle; this.treeNode = treeNode; this.requestTracker = requestTracker; this.glide = Glide.get(context); this.optionsApplier = new OptionsApplier(); ConnectivityMonitor
互联网技术 微信公众号 链接:https://mp.weixin.qq.com/s/cPLkefpEb3w12-uoiqzTig 作者:连凌能 Android上图片加载的解决方案有多种,但是官方认可的是Glide Glide提供简洁易用的api,整个框架也方便扩展,比如可以替换网络请求库,同时也提供了完备的缓存机制,应用层不需要自己去管理图片的缓存与获取,框架会分成内存缓存,文件缓存和远程缓存。 一、综述 开始之前,关于Glide缓存请先思考几个问题: Glide有几级缓存? Glide内存缓存之间是什么关系? Glide本地文件IO和网络请求是一个线程吗?如果不是,怎么实现线程切换? Glide网络请求回来后数据直接返回给用户还是先存再返回? 3、Glide本地文件IO和网络请求是一个线程吗?
1.LinkedHashMap——http://blog.csdn.net/lxj1137800599/article/details/54976180 2.cleanupCallable(涉及到ThreadPoolExecutor——http://blog.csdn.net/lxj1137800599/article/details/55808019) private final Callable<Void> cleanupCallable = new Callable<Void>() {
之前已经讲过 Glide.with 了,那么今天就来讲讲 load 方法。 Glide : https://github.com/bumptech/glide version : v4.9.0 源码解析 load 重载的方法有很多,这里就挑一个看了。 ) @SuppressWarnings("PMD.ConstructorCallsOverridableMethod") protected RequestBuilder( @NonNull Glide glide, RequestManager requestManager, Class<TranscodeType> transcodeClass, Context context ) { this.glide = glide; this.requestManager = requestManager; this.transcodeClass = transcodeClass
为什么会选择 Glide 为什么选择 Glide ,前言中也提到了 毕竟是 Google 推荐的最佳选择。 所以 Glide 胜出。 Glide VS fresco 两个都支持 GIF。所以 GIF 这一关pass掉。 所以需要对NDK有所了解,但个人对NDK不太了解,相比较于 Glide, 同样遇到问题之后,修改源码的成本,Glide 成本更可控。前者可能就不太好下手了的。 综上所述,Glide 依旧胜出。 Glide 是如何解决图片加载生命周期的?(精髓之一)(也是bug高发地带) 当一个界面离开之后,我们更希望当前的图片取消加载,那么 Glide 是怎么做到的呢? 具体源码中可以看到这里: https://github.com/bumptech/glide/blob/master/library/src/main/java/com/bumptech/glide/Glide.java
在上一篇文章中,我们简要的讲了Glide加载一张网络图片的基本流程,整个流程有点长,也有点多,很多东西没有细讲。所以会对Glide一些重要的东西单独写文章讲解,以便大家对Glide细节了解更深。 Glide缓存设计 Glide分成内存缓存和磁盘缓存两个: 内存缓存:基于基于弱引用和LruCache(先看弱引用有无缓存,再看LruCache有无缓存) 磁盘缓存:基于DiskLruCache进行封装 小结: Glide中首先会读取转换后的图片的缓存,然后再读取原始图片的缓存。但是存储的时候恰恰相反,首先存储的是原始图片的缓存,再存储转换后的图片。
Glide、Picasso和Fresco都是目前Android图片加载的主流框架。 Glide与Picasso使用方式及其相似,都是链式一行代码即可搞定。 一、Glide compile 'com.github.bumptech.glide:glide:3.7.0' 加上v4包 Glide.with(this).load("http://goo.gl/ 2.Glide加载的图片质量要差于Picasso,但几乎难以分辨,而且Glide的加载速度更快,但也需要更大的空间来缓存。 Picasso缓存的是全尺寸的,而Glide缓存的是跟ImageView尺寸相同的。 4.Glide可以加载GIF动态图,而Picasso不能。 5.Picasso (v2.5.1)的大小约118kb,而Glide (v3.5.2)的大小约430kb。 6.Picasso和Glide的方法个数分别是840和2678个。
那么本系列给大家带来的就是解析 Glide 的源码,看看背后的 Glide 是什么样子的? Glide : https://github.com/bumptech/glide version : v4.9.0 Glide使用方法 Glide 的 API 有很多,但是我们这里就挑最简单的讲: Glide.with Glide glide = Glide.get(context.getApplicationContext()); applicationManager = factory.build Glide glide = Glide.get(context); requestManager = factory.build( glide, current.getGlideLifecycle 结束语 综上所述,Glide.with 中,主要做的事情有两件: Glide 单例的初始化过程 Glide 请求的生命周期管理 如果传入的是 ApplicationContext ,得到的就是 applicationManager
本篇是 Glide 系列的最后一篇,主要讲一下 into 方法里面的逻辑。into 的逻辑也是最多最复杂的,可能需要反复阅读源码才能搞清楚。 Glide : https://github.com/bumptech/glide version : v4.9.0 RequestBuilder @NonNull public <Y extends 也就是说,当我们从网络中拿到了数据之后 Glide 会先将其缓存到磁盘上面,然后再从磁盘上面读取图片并将其显示到控件上面。 到了这里, Glide 所有加载图片、处理图片的逻辑都讲完了。剩下的,就是将图片显示到 ImageView 上面了。 相信你看完这一系列的文章,对 Glide 会刮目相看吧。 当然,本系列还有很多 Glide 中没讲到的知识点,比如缓存具体的应用等,如果想了解的同学可以自行去阅读下源码。
Glide作为一个图片加载框架深受开发者喜欢,包体积小,加载速度快,以及加载圆角等。作为一名开发者我们有必要去了解Glide图片加载机制,它是如何把图片加载出来的?以及在图片加载过程中它都做了什么? ComponentCallbacks2 { /** * 单利模式获取Glide对象 */ @NonNull public static Glide get(@NonNull Context context) { if (glide == null) { synchronized (Glide.class) { if (glide == null) { 对象 Glide glide = builder.build(applicationContext); // 5. ); // 6.保存为静态常量 Glide.glide = glide; } 在initializeGlide()方法中获取 @GlideModule 注解生成类,然后获取到获取
《看完不忘系列》之Glide (树干篇)一文对Glide加载图片的核心流程做了介绍,细枝篇作为补充,将对一些具体实现细节进行深入。 glide, Registry registry) { super.registerComponents(context, glide, registry); //注册一些定制的能力 ,会包一个中间层来进行隔离(禁止业务层用到Glide的任何类),以便随时可以升级替换,这个中间层就可以根据需要来自行扩展。 glide, Lifecycle lifecycle, //... 即,我们要有这样的意识,既然使用了Glide,就不要再关心Bitmap的事情了,全盘交由BitmapPool管理即可。
那么本系列给大家带来的就是解析 Glide 的源码,看看背后的 Glide 是什么样子的? Glide : https://github.com/bumptech/glide version : v4.9.0 Glide使用方法 Glide 的 API 有很多,但是我们这里就挑最简单的讲: Glide.with Glide glide = Glide.get(context.getApplicationContext()); applicationManager = factory.build Glide glide = Glide.get(context); requestManager = factory.build( glide, current.getGlideLifecycle 结束语 综上所述,Glide.with 中,主要做的事情有两件: Glide 单例的初始化过程 Glide 请求的生命周期管理 如果传入的是 ApplicationContext ,得到的就是 applicationManager
之前已经讲过 Glide.with 了,那么今天就来讲讲 load 方法。 Glide : https://github.com/bumptech/glide version : v4.9.0 源码解析 load 重载的方法有很多,这里就挑一个看了。 ) @SuppressWarnings("PMD.ConstructorCallsOverridableMethod") protected RequestBuilder( @NonNull Glide glide, RequestManager requestManager, Class<TranscodeType> transcodeClass, Context context ) { this.glide = glide; this.requestManager = requestManager; this.transcodeClass = transcodeClass
Glide 是 Google的开源项目, Glide具有获取、解码和展示视频剧照、图片、动画等功能,它还有灵活的API,这些API使开发者能够将Glide应用在几乎任何网络协议栈里。 创建Glide的主要目的有两个,一个是实现平滑的图片列表滚动效果,另一个是支持远程图片的获取、大小调整和展示。本篇博客,我们一起深入分析Glide的源码。 总体设计 with方法 首先我们来看一下glide的一般使用方法 Glide.with(this) .load("http://image.baidu.com/search/detail a registered ModelLoader, if you are using a custom model, you must first call" + " Glide Unable to load null model, setting placeholder only"); } return null; } return Glide.get
Glide的缓存机制 主要分为2种缓存,一种是内存缓存,一种是磁盘缓存 三级缓存原理 加载一张图片的时候,获取顺序: Lru算法缓存 【--->】 弱引用缓存 【--->】 磁盘缓存 源码解析如下: public activeResources.remove(ref.key); } return true; } } } Glide final ExecutorService diskCacheService; private final ExecutorService sourceService; } 一张图片加载的流程 Glide
我想大多数人在自己的项目中还是使用Glide3.7.1这个版本吧!不过Glide版本现在已经到4.4.0了! 当我们把Glide3更换成Glide4,会发现大部分地方都报错了,那么该怎样快速替换Glide3为Glide4呢? 下面我们一起来看看怎样实现Glide3到Glide4的快速替换。 Glide4的基本用法: 引入Glide compiler:包含各种注解的使用,Glide3快速替换成Glide4时要用到。 Glide使用,这样我们就可以很方便的在需要的地方可以进行不同的配置了,不用像Glide3一样传递很多参数! Glide3替换成Glide4(Generated API) 在自定义模块完成以后,就可以使用Glide的模式啦!