aboutsummaryrefslogtreecommitdiff
path: root/library/src/main/java/com/bumptech/glide
diff options
context:
space:
mode:
authorSam Judd <judds@google.com>2014-08-30 11:53:27 -0700
committerSam Judd <judds@google.com>2014-08-30 11:53:27 -0700
commit43c082540013abdd5b5aca4b8c6ed2e1cb335f06 (patch)
tree1031449b9667040ca034df172b1304b862b887de /library/src/main/java/com/bumptech/glide
parentf3c7a66fbe8c2fee588baed934b7c66dc1b72f05 (diff)
downloadglide-43c082540013abdd5b5aca4b8c6ed2e1cb335f06.tar.gz
Don't start new requests while paused.
Fixes #90
Diffstat (limited to 'library/src/main/java/com/bumptech/glide')
-rw-r--r--library/src/main/java/com/bumptech/glide/GenericRequestBuilder.java3
-rw-r--r--library/src/main/java/com/bumptech/glide/manager/RequestTracker.java25
-rw-r--r--library/src/main/java/com/bumptech/glide/request/GenericRequest.java46
3 files changed, 48 insertions, 26 deletions
diff --git a/library/src/main/java/com/bumptech/glide/GenericRequestBuilder.java b/library/src/main/java/com/bumptech/glide/GenericRequestBuilder.java
index 74f9752d..f64e65c3 100644
--- a/library/src/main/java/com/bumptech/glide/GenericRequestBuilder.java
+++ b/library/src/main/java/com/bumptech/glide/GenericRequestBuilder.java
@@ -533,9 +533,8 @@ public class GenericRequestBuilder<ModelType, DataType, ResourceType, TranscodeT
Request request = buildRequest(target);
target.setRequest(request);
- requestTracker.addRequest(request);
- request.begin();
lifecycle.addListener(target);
+ requestTracker.runRequest(request);
return target;
}
diff --git a/library/src/main/java/com/bumptech/glide/manager/RequestTracker.java b/library/src/main/java/com/bumptech/glide/manager/RequestTracker.java
index e5c05b0a..4796edb3 100644
--- a/library/src/main/java/com/bumptech/glide/manager/RequestTracker.java
+++ b/library/src/main/java/com/bumptech/glide/manager/RequestTracker.java
@@ -17,11 +17,20 @@ public class RequestTracker {
// can always make repeated requests into targets other than views, or use an activity manager in a fragment pager
// where holding strong references would steadily leak bitmaps and/or views.
private final Set<Request> requests = Collections.newSetFromMap(new WeakHashMap<Request, Boolean>());
+ private boolean isPaused;
/**
* Starts tracking the given request.
*/
- public void addRequest(Request request) {
+ public void runRequest(Request request) {
+ requests.add(request);
+ if (!isPaused) {
+ request.begin();
+ }
+ }
+
+ // Exposed for testing.
+ void addRequest(Request request) {
requests.add(request);
}
@@ -36,6 +45,7 @@ public class RequestTracker {
* Stops any in progress requests.
*/
public void pauseRequests() {
+ isPaused = true;
for (Request request : requests) {
if (!request.isComplete() && !request.isFailed()) {
request.clear();
@@ -47,6 +57,7 @@ public class RequestTracker {
* Starts any not yet completed or failed requests.
*/
public void resumeRequests() {
+ isPaused = false;
for (Request request : requests) {
if (!request.isComplete() && !request.isRunning()) {
request.begin();
@@ -69,10 +80,18 @@ public class RequestTracker {
public void restartRequests() {
for (Request request : requests) {
if (request.isFailed()) {
- request.begin();
+ if (isPaused) {
+ // Ensure the request will be restarted in onResume.
+ request.clear();
+ } else {
+ request.begin();
+ }
} else if (!request.isComplete()) {
+ // Make sure we re-queue the request, we may just have not received the failure yet.
request.clear();
- request.begin();
+ if (!isPaused) {
+ request.begin();
+ }
}
}
}
diff --git a/library/src/main/java/com/bumptech/glide/request/GenericRequest.java b/library/src/main/java/com/bumptech/glide/request/GenericRequest.java
index 29d5caf0..cc79916c 100644
--- a/library/src/main/java/com/bumptech/glide/request/GenericRequest.java
+++ b/library/src/main/java/com/bumptech/glide/request/GenericRequest.java
@@ -37,6 +37,16 @@ import java.util.Queue;
public final class GenericRequest<A, T, Z, R> implements Request, SizeReadyCallback,
ResourceCallback {
private static final String TAG = "GenericRequest";
+ private static final Queue<GenericRequest> REQUEST_POOL = new ArrayDeque<GenericRequest>();
+
+ private enum Status {
+ PENDING,
+ RUNNING,
+ WAITING_FOR_SIZE,
+ COMPLETE,
+ FAILED,
+ CANCELLED,
+ }
private int placeholderResourceId;
private int errorResourceId;
@@ -60,15 +70,11 @@ public final class GenericRequest<A, T, Z, R> implements Request, SizeReadyCallb
private Drawable placeholderDrawable;
private Drawable errorDrawable;
- private boolean isCancelled;
- private boolean isError;
private boolean loadedFromMemoryCache;
private Resource resource;
private Engine.LoadStatus loadStatus;
- private boolean isRunning;
private long startTime;
-
- private static final Queue<GenericRequest> REQUEST_POOL = new ArrayDeque<GenericRequest>();
+ private Status status;
@SuppressWarnings("unchecked")
public static <A, T, Z, R> GenericRequest<A, T, Z, R> obtain(
@@ -120,7 +126,7 @@ public final class GenericRequest<A, T, Z, R> implements Request, SizeReadyCallb
}
private GenericRequest() {
-
+ // Empty.
}
@Override
@@ -135,11 +141,8 @@ public final class GenericRequest<A, T, Z, R> implements Request, SizeReadyCallb
requestCoordinator = null;
transformation = null;
animationFactory = null;
- isCancelled = false;
- isError = false;
loadedFromMemoryCache = false;
loadStatus = null;
- isRunning = false;
REQUEST_POOL.offer(this);
}
@@ -184,6 +187,7 @@ public final class GenericRequest<A, T, Z, R> implements Request, SizeReadyCallb
this.overrideWidth = overrideWidth;
this.overrideHeight = overrideHeight;
this.diskCacheStrategy = diskCacheStrategy;
+ status = Status.PENDING;
// We allow null models by just setting an error drawable. Null models will always have empty providers, we
// simply skip our sanity checks in that unusual case.
@@ -220,12 +224,12 @@ public final class GenericRequest<A, T, Z, R> implements Request, SizeReadyCallb
@Override
public void begin() {
startTime = LogTime.getLogTime();
- isCancelled = false;
if (model == null) {
onException(null);
return;
}
+ status = Status.WAITING_FOR_SIZE;
if (overrideWidth > 0 && overrideHeight > 0) {
onSizeReady(overrideWidth, overrideHeight);
} else {
@@ -236,7 +240,6 @@ public final class GenericRequest<A, T, Z, R> implements Request, SizeReadyCallb
if (canNotifyStatusChanged()) {
target.onLoadStarted(getPlaceholderDrawable());
}
- isRunning = true;
}
if (Log.isLoggable(TAG, Log.VERBOSE)) {
logV("finished run method in " + LogTime.getElapsedMillis(startTime));
@@ -253,9 +256,8 @@ public final class GenericRequest<A, T, Z, R> implements Request, SizeReadyCallb
*
* @see #clear()
*/
- public void cancel() {
- isRunning = false;
- isCancelled = true;
+ void cancel() {
+ status = Status.CANCELLED;
if (loadStatus != null) {
loadStatus.cancel();
loadStatus = null;
@@ -290,7 +292,7 @@ public final class GenericRequest<A, T, Z, R> implements Request, SizeReadyCallb
*/
@Override
public boolean isRunning() {
- return isRunning;
+ return status == Status.RUNNING || status == Status.WAITING_FOR_SIZE;
}
/**
@@ -298,7 +300,7 @@ public final class GenericRequest<A, T, Z, R> implements Request, SizeReadyCallb
*/
@Override
public boolean isComplete() {
- return resource != null;
+ return status == Status.COMPLETE;
}
/**
@@ -306,7 +308,7 @@ public final class GenericRequest<A, T, Z, R> implements Request, SizeReadyCallb
*/
@Override
public boolean isFailed() {
- return isError;
+ return status == Status.FAILED;
}
private void setErrorPlaceholder(Exception e) {
@@ -343,9 +345,10 @@ public final class GenericRequest<A, T, Z, R> implements Request, SizeReadyCallb
if (Log.isLoggable(TAG, Log.VERBOSE)) {
logV("Got onSizeReady in " + LogTime.getElapsedMillis(startTime));
}
- if (isCancelled) {
+ if (status != Status.WAITING_FOR_SIZE) {
return;
}
+ status = Status.RUNNING;
width = Math.round(sizeMultiplier * width);
height = Math.round(sizeMultiplier * height);
@@ -394,9 +397,10 @@ public final class GenericRequest<A, T, Z, R> implements Request, SizeReadyCallb
@SuppressWarnings("unchecked")
@Override
public void onResourceReady(Resource resource) {
- isRunning = false;
if (!canSetResource()) {
resource.release();
+ // We can't set the status to complete before asking canSetResource().
+ status = Status.COMPLETE;
return;
}
Object received = resource != null ? resource.get() : null;
@@ -409,6 +413,7 @@ public final class GenericRequest<A, T, Z, R> implements Request, SizeReadyCallb
return;
}
R result = (R) received;
+ status = Status.COMPLETE;
if (requestListener == null || !requestListener.onResourceReady(result, model, target, loadedFromMemoryCache,
isFirstReadyResource())) {
@@ -433,8 +438,7 @@ public final class GenericRequest<A, T, Z, R> implements Request, SizeReadyCallb
Log.d(TAG, "load failed", e);
}
- isRunning = false;
- isError = true;
+ status = Status.FAILED;
//TODO: what if this is a thumbnail request?
if (requestListener == null || !requestListener.onException(e, model, target, isFirstReadyResource())) {
setErrorPlaceholder(e);