Glide 为什么优秀

tueojm20 2年前
   <h2>Glide</h2>    <p>Android 开发中需要处理图片的地方很多,但如何针对 Android 平台的特性,将图片这件不简单的事情,做到顺滑流畅则没那么简单。今天就分析下,Google 推荐的 Glide 开源框架,看看这个框架如何做好这件不简单的事情。</p>    <h3>Glide 为什么优秀?</h3>    <p>首先来分析下,一个优秀的图片库应该具有什么样的特性?</p>    <ol>     <li>易用性。这对于绝大多数开源库而言,都是需要做到的,但这又是很难的一方面。举个例子,图片库涉及到网络、缓存、编码等等各个环节,但这些环节不应该让所有用户都知晓,应该拿捏到这种力度:用户可以不知晓,有需求的可以进行自定义。开源库可能有很多类用户可以涉及,但最好有统一的外观(Facade Pattern),Glide 在这点上就做得足够好。</li>     <li>扩展性。需求这东西嘛,总是比天气变化快多了,设计的开源库就必须得有很好的扩展性。无论是 Volley,Glide 还是其他知名开源库,在这点上都做得很好。关键在于抽象::不变的与变化的::,变化的是 网络 , 编码 和 缓存 等等模块,不变的是它们之间是如何衔接的。在合理的抽象建模下,还是很容易高的扩展性的。</li>     <li>高性能与低占用。这是图片库最核心的部分,也是最难的部分。难点在于三个方面。      <ul>       <li>内存受限。受限于移动终端的低内存,如果占用内存过大,会使得分配变得低效,不稳定。如果复用不给力,高频率的分配内存,会导致GC频繁,从而卡顿。</li>       <li>流畅性。Android 系统中的图片常用于 RecyclerView,GridView 中,这些控件往往展示着大量的图片,在这些图片频繁加载、编码等等情况下,保证滑动流畅呢?</li>       <li>生命周期。Android的UI组件有各个周期,Glide 要在尽可能少入侵代码的前提下,参与到生命周期里面去,从而合理地分配和释放资源。</li>      </ul> </li>    </ol>    <h3>Glide 如何做到易用性的?</h3>    <p>本节和后序的章节,暂不涉及具体的源码,后续的文章再做分析。要想要让 Glide 易用,主要还是在 API 的设计上面。这里提出一个概念, 链式调用 ,是指一些方法能够直接通过 . 的形式进行连接。</p>    <pre>  Glide.with(this).load(url).placeholder(resId).error(resId).into(mImageView);  </pre>    <p>上面的代码就是一个链式调用的例子,将 Glide 需要配置的地方,用一行代码就可以表达出来。我们常见的 RxJava、Java Builder 等等都采用了这种方式。</p>    <p>除了链式调用以外,Glide 的易用性,还提现在完善的职能模块,简单明了的接口。用户可以根据自身的需要进行自定义,也可以使用默认的方案。</p>    <p><img src="https://simg.open-open.com/show/fab6f5a579b9f9dc16d5ea73ff8c92e5.png"></p>    <p>Glide API</p>    <p>如上图所示,Glide 将用户能够自定义的内容,都通过模块和相应的接口暴露出来,开发者可以根据自身需要,只对部分模块进行自定义即可。</p>    <h3>Glide 如何实现高的扩展性?</h3>    <p>高的扩展性前提就是清晰的模块划分,只有在这种情况下,模块才能进行 插拔 和 替换 ,从而实现扩展性。</p>    <p><img src="https://simg.open-open.com/show/18779334f56e177865a66c6e76ad7925.png"></p>    <p>Glide Module</p>    <p>Glide 在大体上划分为 Request 、 Cache 、 Module 、 Decode 等等模块,统一由 Registry 进行管理。在这个基础上,Glide 就能实现很好的扩展性。例如 Request 模块,即可以使用默认的,也可以使用 Volley 或者 OKHttp 。</p>    <h3>Glide 如何实现好的性能?</h3>    <p>Glide 的性能方面的掌控,主要由三个方面来实施的。</p>    <ol>     <li>良好的复用模块。这是最核心的部分,当这块内存能够不断地被循环使用,能减少 GC 和分配的次数。内存操作一般情况下,都是 Stop the world 的,UI 线程也会因此中断,因而这对 APP 的性能极为关键。复用手段包括,但不止 LruCache 、 Object Pool 。</li>     <li>本地化的生命周期。对于图片资源的释放,很少在保证即时性的情况下,又不需要开发者感知的。Glide 通过一个小技巧达成了目的,后续文章具体介绍哈。</li>     <li>对 RecyclerView 等等控件的细节调优。不要小看这些细节,罗马就是这么搭建出来的,抠的这些小细节,才是大师所为。</li>    </ol>    <h3>文档信息</h3>    <ul>     <li>版权声明:自由转载-非商用-非衍生-保持署名( <a href="/misc/goto?guid=4958860413521207309" rel="nofollow,noindex">创意共享3.0许可证</a> )</li>     <li>发表日期:2017年10月22日</li>     <li>社交媒体:weibo.com/woaitqs</li>     <li>Feed订阅: <a href="/misc/goto?guid=4959755065860479252" rel="nofollow,noindex">www.woaitqs.cc/feed.xml</a></li>    </ul>    <p>最后更新时间: 2017-10-22 15:08:31</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/b5dc1a099b44a3a79859f47d5b9a8a91.jpg"></p>    <p> </p>    <p>来自:http://www.woaitqs.cc/2017/10/22/Glide-为什么优秀/</p>    <p> </p>