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