EngineJob.java revision ac28599e2b40e0dd6b97f6a91849585531264622
1package com.bumptech.glide.load.engine; 2 3import android.os.Handler; 4import com.bumptech.glide.Resource; 5import com.bumptech.glide.load.Key; 6import com.bumptech.glide.load.engine.cache.MemoryCache; 7import com.bumptech.glide.request.ResourceCallback; 8 9import java.util.ArrayList; 10import java.util.List; 11 12public class EngineJob implements ResourceCallback { 13 private final EngineJobListener listener; 14 private Key key; 15 private MemoryCache cache; 16 private Handler mainHandler; 17 private List<ResourceCallback> cbs = new ArrayList<ResourceCallback>(); 18 private boolean isCancelled; 19 private boolean isComplete; 20 21 public EngineJob(Key key, MemoryCache cache, Handler mainHandler, EngineJobListener listener) { 22 this.key = key; 23 this.cache = cache; 24 this.listener = listener; 25 this.mainHandler = mainHandler; 26 } 27 28 public void addCallback(ResourceCallback cb) { 29 cbs.add(cb); 30 } 31 32 public void removeCallback(ResourceCallback cb) { 33 cbs.remove(cb); 34 if (cbs.size() == 0) { 35 cancel(); 36 } 37 } 38 39 // Exposed for testing. 40 void cancel() { 41 if (isComplete || isCancelled) { 42 return; 43 } 44 isCancelled = true; 45 listener.onEngineJobCancelled(key); 46 } 47 48 // Exposed for testing. 49 boolean isCancelled() { 50 return isCancelled; 51 } 52 53 @Override 54 public void onResourceReady(final Resource resource) { 55 mainHandler.post(new Runnable() { 56 @Override 57 public void run() { 58 if (isCancelled) { 59 resource.recycle(); 60 return; 61 } 62 isComplete = true; 63 64 // 1 for memory cache. 65 resource.acquire(cbs.size() + 1); 66 listener.onEngineJobComplete(key); 67 cache.put(key, resource); 68 for (ResourceCallback cb : cbs) { 69 cb.onResourceReady(resource); 70 } 71 72 } 73 }); 74 } 75 76 @Override 77 public void onException(final Exception e) { 78 mainHandler.post(new Runnable() { 79 @Override 80 public void run() { 81 if (isCancelled) { 82 return; 83 } 84 isComplete = true; 85 86 listener.onEngineJobComplete(key); 87 for (ResourceCallback cb : cbs) { 88 cb.onException(e); 89 } 90 } 91 }); 92 } 93} 94