<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 {</span><br><span class="line"></span><br><span class="line"> public <T, Z, R> LoadStatus load(Key signature, int width, int height, DataFetcher<T> fetcher,</span><br><span class="line"> DataLoadProvider<T, Z> loadProvider, Transformation<Z> transformation, ResourceTranscoder<Z, R> transcoder,</span><br><span class="line"> Priority priority, boolean isMemoryCacheable, DiskCacheStrategy diskCacheStrategy, ResourceCallback cb) {</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<?> cached = loadFromCache(key, isMemoryCacheable);</span><br><span class="line"> if (cached != null) {</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)) {</span><br><span class="line"> logWithTimeAndKey("Loaded resource from cache", startTime, key);</span><br><span class="line"> }</span><br><span class="line"> return null;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> /// 从activeResources中获取</span><br><span class="line"> EngineResource<?> active = loadFromActiveResources(key, isMemoryCacheable);</span><br><span class="line"> if (active != null) {</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)) {</span><br><span class="line"> logWithTimeAndKey("Loaded resource from active resources", startTime, key);</span><br><span class="line"> }</span><br><span class="line"> return null;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> ......</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> private EngineResource<?> loadFromActiveResources(Key key, boolean isMemoryCacheable) {</span><br><span class="line"> if (!isMemoryCacheable) {</span><br><span class="line"> return null;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> EngineResource<?> active = null;</span><br><span class="line"> WeakReference<EngineResource<?>> activeRef = activeResources.get(key);</span><br><span class="line"> if (activeRef != null) {</span><br><span class="line"> active = activeRef.get();</span><br><span class="line"> if (active != null) {</span><br><span class="line"> active.acquire();</span><br><span class="line"> } else {</span><br><span class="line"> activeResources.remove(key);</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> return active;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> ///从LruResourceCache中获取,若有则移除并放入activesource</span><br><span class="line"> private EngineResource<?> loadFromCache(Key key, boolean isMemoryCacheable) {</span><br><span class="line"> if (!isMemoryCacheable) {</span><br><span class="line"> return null;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> EngineResource<?> cached = getEngineResourceFromCache(key);</span><br><span class="line"> if (cached != null) {</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"> }</span><br><span class="line"> return cached;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> @SuppressWarnings("unchecked")</span><br><span class="line"> private EngineResource<?> getEngineResourceFromCache(Key key) {</span><br><span class="line"> Resource<?> 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) {</span><br><span class="line"> result = null;</span><br><span class="line"> } else if (cached instanceof EngineResource) {</span><br><span class="line"> // Save an object allocation if we've cached an EngineResource (the typical case).</span><br><span class="line"> result = (EngineResource) cached;</span><br><span class="line"> } else {</span><br><span class="line"> result = new EngineResource(cached, true /*isCacheable*/);</span><br><span class="line"> }</span><br><span class="line"> return result;</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
0 commit comments