Skip to content

Commit cf397d0

Browse files
committed
Site updated: 2017-05-08 11:46:33
1 parent 8d64d9a commit cf397d0

File tree

4 files changed

+21
-385
lines changed

4 files changed

+21
-385
lines changed

2017/04/27/Glide源码解析(一):加载流程/index.html

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@
118118
<meta property="og:image" content="http://o8swcawjo.bkt.clouddn.com/GenericRequestBuilder.png">
119119
<meta property="og:image" content="http://o8swcawjo.bkt.clouddn.com/DataLoadProvider.png">
120120
<meta property="og:image" content="http://o8swcawjo.bkt.clouddn.com/FixLoadProvider.png">
121-
<meta property="og:updated_time" content="2017-05-08T03:41:02.000Z">
121+
<meta property="og:updated_time" content="2017-05-08T03:44:25.000Z">
122122
<meta name="twitter:card" content="summary">
123123
<meta name="twitter:title" content="Glide源码解析(一):加载流程">
124124
<meta name="twitter:description" content="Glide源码解析(一):加载流程对于 Glide 相信大家都不陌生,它是 Google 员工 bumptech 开源的一款图片加载框架,因为其简单易用的 API ,强大的功能,优秀的内存管理被 Google 官方所推荐并且被广泛运用在 Google 的开源项目中。目前 Glide 、Picasso 和 Fresco 都是比较主流图片加载框架。
@@ -438,6 +438,7 @@ <h1 class="post-title" itemprop="name headline">
438438
<h2 id="Glide源码解析(一):加载流程"><a href="#Glide源码解析(一):加载流程" class="headerlink" title="Glide源码解析(一):加载流程"></a>Glide源码解析(一):加载流程</h2><p>对于 Glide 相信大家都不陌生,它是 Google 员工 bumptech 开源的一款图片加载框架,因为其简单易用的 API ,强大的功能,优秀的内存管理被 Google 官方所推荐并且被广泛运用在 Google 的开源项目中。目前 Glide 、Picasso 和 Fresco 都是比较主流图片加载框架。</p>
439439
<p>它们的使用场景基本都是重合的,而本人对 Glide 更为熟悉,所以选取 Glide 来进行深入学习,这系列文章作为学习的总结。选取的 Glide 版本是比较新的稳定版 3.7.0 。</p>
440440
<p>本篇是源码解析的开篇,主要分析 Glide 加载图片的基本流程。在后续的专题中再对缓存机制、生命周期监听等细节进行详细分析。</p>
441+
<a id="more"></a>
441442
<h3 id="预热"><a href="#预热" class="headerlink" title="预热"></a>预热</h3><p>为了预防直接扎进源码的海洋带来的各种不适,做一下热身还是很有必要的。我们先抛开源码,从感性角度理解 Glide 成功显示出一张图片,需要经过哪些过程,由什么角色完成,这些角色有机结合起来就是整个基本流程了。</p>
442443
<ul>
443444
<li>数据源。即对数据来源的描述,要加载图片,当然需要告诉 Glide 从哪里获取了。它可以是 URL ,资源 ID 或者是一个文件。Glide 中称之为 Model。</li>

2017/05/08/Glide源码解析(二):缓存机制/index.html

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@
114114
<meta property="og:description" content="Glide源码解析(二):缓存机制本文是 Glide 源码分析系列的第二篇,主要通过分析源码总结 Glide 的缓存机制。
115115
从加载流程揭开缓存机制的面纱首先回忆一下上一篇关于 Glide 加载流程源码分析的内容,我们从 Glide.with().load().into() 这个最简单最基本的用法入手,一步步深入源码,梳理出了完整的图片加载流程。由于当时分析重点在于整体流程的把握上,所以对于缓存相关">
116116
<meta property="og:image" content="http://o8swcawjo.bkt.clouddn.com/%E7%BC%93%E5%AD%98%E6%B5%81%E7%A8%8B.png">
117-
<meta property="og:updated_time" content="2017-05-08T03:42:42.000Z">
117+
<meta property="og:updated_time" content="2017-05-08T03:44:44.000Z">
118118
<meta name="twitter:card" content="summary">
119119
<meta name="twitter:title" content="Glide源码解析(二):缓存机制">
120120
<meta name="twitter:description" content="Glide源码解析(二):缓存机制本文是 Glide 源码分析系列的第二篇,主要通过分析源码总结 Glide 的缓存机制。
@@ -435,6 +435,7 @@ <h2 id="Glide源码解析(二):缓存机制"><a href="#Glide源码解析
435435
<h3 id="从加载流程揭开缓存机制的面纱"><a href="#从加载流程揭开缓存机制的面纱" class="headerlink" title="从加载流程揭开缓存机制的面纱"></a>从加载流程揭开缓存机制的面纱</h3><p>首先回忆一下上一篇关于 Glide 加载流程源码分析的内容,我们从 Glide.with().load().into() 这个最简单最基本的用法入手,一步步深入源码,梳理出了完整的图片加载流程。由于当时分析重点在于整体流程的把握上,所以对于缓存相关的部分都是简单带过而没有进行深入分析。首先是为了避免文章篇幅过长,其次因为缓存它不是独立的部分,它埋藏在整个加载流程的各个环节中,所以对缓存机制的理解应该建立在对整体流程清晰的把握上。</p>
436436
<p>而在本文中,我们将从整个加载流程入手,找出缓存相关的部分,进而还原出 Glide 缓存机制的整体面貌。然后再对各个部分进行详细分析。</p>
437437
<p>那么我们开始来看看加载流程中被我们错过的缓存操作。</p>
438+
<a id="more"></a>
438439
<h4 id="发起请求前"><a href="#发起请求前" class="headerlink" title="发起请求前"></a>发起请求前</h4><p>我们在 GenericRequestBuilder 中构建了一个 GenericRequest 实例并交给 RequestTracker 去处理,执行它的 begin() 方法。在 GenericRequest 的 确定了 ImageView 的大小之后在 onSizeReady() 回调中调用了 Engine 的load() 进行加载。这时我们第一次遇到了缓存操作</p>
439440
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br></pre></td><td class="code"><pre><span class="line">public class Engine implements EngineJobListener,</span><br><span class="line"> MemoryCache.ResourceRemovedListener,</span><br><span class="line"> EngineResource.ResourceListener &#123;</span><br><span class="line"></span><br><span class="line"> public &lt;T, Z, R&gt; LoadStatus load(Key signature, int width, int height, DataFetcher&lt;T&gt; fetcher,</span><br><span class="line"> DataLoadProvider&lt;T, Z&gt; loadProvider, Transformation&lt;Z&gt; transformation, ResourceTranscoder&lt;Z, R&gt; transcoder,</span><br><span class="line"> Priority priority, boolean isMemoryCacheable, DiskCacheStrategy diskCacheStrategy, ResourceCallback cb) &#123;</span><br><span class="line"> ......</span><br><span class="line"></span><br><span class="line"> final String id = fetcher.getId();</span><br><span class="line"> EngineKey key = keyFactory.buildKey(id, signature, width, height, loadProvider.getCacheDecoder(),</span><br><span class="line"> loadProvider.getSourceDecoder(), transformation, loadProvider.getEncoder(),</span><br><span class="line"> transcoder, loadProvider.getSourceEncoder());</span><br><span class="line"></span><br><span class="line"> /// 从LruResourceCache中获取</span><br><span class="line"> EngineResource&lt;?&gt; cached = loadFromCache(key, isMemoryCacheable);</span><br><span class="line"> if (cached != null) &#123;</span><br><span class="line"> ///GenericRequest</span><br><span class="line"> cb.onResourceReady(cached);</span><br><span class="line"> if (Log.isLoggable(TAG, Log.VERBOSE)) &#123;</span><br><span class="line"> logWithTimeAndKey(&quot;Loaded resource from cache&quot;, startTime, key);</span><br><span class="line"> &#125;</span><br><span class="line"> return null;</span><br><span class="line"> &#125;</span><br><span class="line"></span><br><span class="line"> /// 从activeResources中获取</span><br><span class="line"> EngineResource&lt;?&gt; active = loadFromActiveResources(key, isMemoryCacheable);</span><br><span class="line"> if (active != null) &#123;</span><br><span class="line"> ///GenericRequest</span><br><span class="line"> cb.onResourceReady(active);</span><br><span class="line"> if (Log.isLoggable(TAG, Log.VERBOSE)) &#123;</span><br><span class="line"> logWithTimeAndKey(&quot;Loaded resource from active resources&quot;, startTime, key);</span><br><span class="line"> &#125;</span><br><span class="line"> return null;</span><br><span class="line"> &#125;</span><br><span class="line"></span><br><span class="line"> ......</span><br><span class="line"> &#125;</span><br><span class="line"></span><br><span class="line"> private EngineResource&lt;?&gt; loadFromActiveResources(Key key, boolean isMemoryCacheable) &#123;</span><br><span class="line"> if (!isMemoryCacheable) &#123;</span><br><span class="line"> return null;</span><br><span class="line"> &#125;</span><br><span class="line"></span><br><span class="line"> EngineResource&lt;?&gt; active = null;</span><br><span class="line"> WeakReference&lt;EngineResource&lt;?&gt;&gt; activeRef = activeResources.get(key);</span><br><span class="line"> if (activeRef != null) &#123;</span><br><span class="line"> active = activeRef.get();</span><br><span class="line"> if (active != null) &#123;</span><br><span class="line"> active.acquire();</span><br><span class="line"> &#125; else &#123;</span><br><span class="line"> activeResources.remove(key);</span><br><span class="line"> &#125;</span><br><span class="line"> &#125;</span><br><span class="line"></span><br><span class="line"> return active;</span><br><span class="line"> &#125;</span><br><span class="line"></span><br><span class="line"> ///从LruResourceCache中获取,若有则移除并放入activesource</span><br><span class="line"> private EngineResource&lt;?&gt; loadFromCache(Key key, boolean isMemoryCacheable) &#123;</span><br><span class="line"> if (!isMemoryCacheable) &#123;</span><br><span class="line"> return null;</span><br><span class="line"> &#125;</span><br><span class="line"></span><br><span class="line"> EngineResource&lt;?&gt; cached = getEngineResourceFromCache(key);</span><br><span class="line"> if (cached != null) &#123;</span><br><span class="line"> cached.acquire();</span><br><span class="line"> activeResources.put(key, new ResourceWeakReference(key, cached, getReferenceQueue()));</span><br><span class="line"> &#125;</span><br><span class="line"> return cached;</span><br><span class="line"> &#125;</span><br><span class="line"></span><br><span class="line"> @SuppressWarnings(&quot;unchecked&quot;)</span><br><span class="line"> private EngineResource&lt;?&gt; getEngineResourceFromCache(Key key) &#123;</span><br><span class="line"> Resource&lt;?&gt; cached = cache.remove(key);</span><br><span class="line"></span><br><span class="line"> final EngineResource result;</span><br><span class="line"> if (cached == null) &#123;</span><br><span class="line"> result = null;</span><br><span class="line"> &#125; else if (cached instanceof EngineResource) &#123;</span><br><span class="line"> // Save an object allocation if we&apos;ve cached an EngineResource (the typical case).</span><br><span class="line"> result = (EngineResource) cached;</span><br><span class="line"> &#125; else &#123;</span><br><span class="line"> result = new EngineResource(cached, true /*isCacheable*/);</span><br><span class="line"> &#125;</span><br><span class="line"> return result;</span><br><span class="line"> &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>
440441
<p>程序首先调用 loadFromCache() 尝试从 MemoryCache 中获取,如果命中缓存则将缓存从 MemoryCache 中移除并放入 activeResources,然后返回。如果缓存失效则尝试从 activeResources 中获取,如果都失效再构建 EngineRunnable 从磁盘或者网络获取。</p>

css/main.css

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1705,7 +1705,7 @@ pre .javascript .function {
17051705
width: 4px;
17061706
height: 4px;
17071707
border-radius: 50%;
1708-
background: #e08cb4;
1708+
background: #85ffd0;
17091709
}
17101710
.links-of-blogroll {
17111711
font-size: 13px;

0 commit comments

Comments
 (0)