提交 65048a4a 编写于 作者: S Sam Judd

Pass through exception messages to RequestFutureTarget.

We may want to more generically handle multiple RequestListeners in the
future, but for now we can at least avoid swallowing exceptions in 
RequestFutureTarget without allocating new Lists every time a RequestListener is added.
上级 cb1276d5
...@@ -476,10 +476,19 @@ public class RequestBuilder<TranscodeType> implements Cloneable { ...@@ -476,10 +476,19 @@ public class RequestBuilder<TranscodeType> implements Cloneable {
* @see RequestManager#clear(Target) * @see RequestManager#clear(Target)
*/ */
public <Y extends Target<TranscodeType>> Y into(@NonNull Y target) { public <Y extends Target<TranscodeType>> Y into(@NonNull Y target) {
return into(target, getMutableOptions()); return into(target, /*targetListener=*/ null);
} }
private <Y extends Target<TranscodeType>> Y into(@NonNull Y target, RequestOptions options) { private <Y extends Target<TranscodeType>> Y into(
@NonNull Y target,
@Nullable RequestListener<TranscodeType> targetListener) {
return into(target, targetListener, getMutableOptions());
}
private <Y extends Target<TranscodeType>> Y into(
@NonNull Y target,
@Nullable RequestListener<TranscodeType> targetListener,
RequestOptions options) {
Util.assertMainThread(); Util.assertMainThread();
Preconditions.checkNotNull(target); Preconditions.checkNotNull(target);
if (!isModelSet) { if (!isModelSet) {
...@@ -487,7 +496,7 @@ public class RequestBuilder<TranscodeType> implements Cloneable { ...@@ -487,7 +496,7 @@ public class RequestBuilder<TranscodeType> implements Cloneable {
} }
options = options.autoClone(); options = options.autoClone();
Request request = buildRequest(target, options); Request request = buildRequest(target, targetListener, options);
Request previous = target.getRequest(); Request previous = target.getRequest();
if (request.isEquivalentTo(previous)) { if (request.isEquivalentTo(previous)) {
...@@ -557,7 +566,10 @@ public class RequestBuilder<TranscodeType> implements Cloneable { ...@@ -557,7 +566,10 @@ public class RequestBuilder<TranscodeType> implements Cloneable {
} }
} }
return into(glideContext.buildImageViewTarget(view, transcodeClass), requestOptions); return into(
glideContext.buildImageViewTarget(view, transcodeClass),
/*targetListener=*/ null,
requestOptions);
} }
/** /**
...@@ -617,12 +629,12 @@ public class RequestBuilder<TranscodeType> implements Cloneable { ...@@ -617,12 +629,12 @@ public class RequestBuilder<TranscodeType> implements Cloneable {
@Override @Override
public void run() { public void run() {
if (!target.isCancelled()) { if (!target.isCancelled()) {
into(target); into(target, target);
} }
} }
}); });
} else { } else {
into(target); into(target, target);
} }
return target; return target;
...@@ -717,15 +729,30 @@ public class RequestBuilder<TranscodeType> implements Cloneable { ...@@ -717,15 +729,30 @@ public class RequestBuilder<TranscodeType> implements Cloneable {
} }
} }
private Request buildRequest(Target<TranscodeType> target, RequestOptions requestOptions) { private Request buildRequest(
return buildRequestRecursive(target, null, transitionOptions, requestOptions.getPriority(), Target<TranscodeType> target,
requestOptions.getOverrideWidth(), requestOptions.getOverrideHeight(), requestOptions); @Nullable RequestListener<TranscodeType> targetListener,
} RequestOptions requestOptions) {
return buildRequestRecursive(
private Request buildRequestRecursive(Target<TranscodeType> target, target,
targetListener,
/*requestCoordinator=*/ null,
transitionOptions,
requestOptions.getPriority(),
requestOptions.getOverrideWidth(),
requestOptions.getOverrideHeight(),
requestOptions);
}
private Request buildRequestRecursive(
Target<TranscodeType> target,
@Nullable RequestListener<TranscodeType> targetListener,
@Nullable RequestCoordinator parentCoordinator, @Nullable RequestCoordinator parentCoordinator,
TransitionOptions<?, ? super TranscodeType> transitionOptions, TransitionOptions<?, ? super TranscodeType> transitionOptions,
Priority priority, int overrideWidth, int overrideHeight, RequestOptions requestOptions) { Priority priority,
int overrideWidth,
int overrideHeight,
RequestOptions requestOptions) {
// Build the ErrorRequestCoordinator first if necessary so we can update parentCoordinator. // Build the ErrorRequestCoordinator first if necessary so we can update parentCoordinator.
ErrorRequestCoordinator errorRequestCoordinator = null; ErrorRequestCoordinator errorRequestCoordinator = null;
...@@ -737,6 +764,7 @@ public class RequestBuilder<TranscodeType> implements Cloneable { ...@@ -737,6 +764,7 @@ public class RequestBuilder<TranscodeType> implements Cloneable {
Request mainRequest = Request mainRequest =
buildThumbnailRequestRecursive( buildThumbnailRequestRecursive(
target, target,
targetListener,
parentCoordinator, parentCoordinator,
transitionOptions, transitionOptions,
priority, priority,
...@@ -758,6 +786,7 @@ public class RequestBuilder<TranscodeType> implements Cloneable { ...@@ -758,6 +786,7 @@ public class RequestBuilder<TranscodeType> implements Cloneable {
Request errorRequest = errorBuilder.buildRequestRecursive( Request errorRequest = errorBuilder.buildRequestRecursive(
target, target,
targetListener,
errorRequestCoordinator, errorRequestCoordinator,
errorBuilder.transitionOptions, errorBuilder.transitionOptions,
errorBuilder.requestOptions.getPriority(), errorBuilder.requestOptions.getPriority(),
...@@ -768,10 +797,15 @@ public class RequestBuilder<TranscodeType> implements Cloneable { ...@@ -768,10 +797,15 @@ public class RequestBuilder<TranscodeType> implements Cloneable {
return errorRequestCoordinator; return errorRequestCoordinator;
} }
private Request buildThumbnailRequestRecursive(Target<TranscodeType> target, private Request buildThumbnailRequestRecursive(
@Nullable RequestCoordinator parentCoordinator, Target<TranscodeType> target,
TransitionOptions<?, ? super TranscodeType> transitionOptions, RequestListener<TranscodeType> targetListener,
Priority priority, int overrideWidth, int overrideHeight, RequestOptions requestOptions) { @Nullable RequestCoordinator parentCoordinator,
TransitionOptions<?, ? super TranscodeType> transitionOptions,
Priority priority,
int overrideWidth,
int overrideHeight,
RequestOptions requestOptions) {
if (thumbnailBuilder != null) { if (thumbnailBuilder != null) {
// Recursive case: contains a potentially recursive thumbnail request builder. // Recursive case: contains a potentially recursive thumbnail request builder.
if (isThumbnailBuilt) { if (isThumbnailBuilt) {
...@@ -800,13 +834,22 @@ public class RequestBuilder<TranscodeType> implements Cloneable { ...@@ -800,13 +834,22 @@ public class RequestBuilder<TranscodeType> implements Cloneable {
} }
ThumbnailRequestCoordinator coordinator = new ThumbnailRequestCoordinator(parentCoordinator); ThumbnailRequestCoordinator coordinator = new ThumbnailRequestCoordinator(parentCoordinator);
Request fullRequest = obtainRequest(target, requestOptions, coordinator, Request fullRequest =
transitionOptions, priority, overrideWidth, overrideHeight); obtainRequest(
target,
targetListener,
requestOptions,
coordinator,
transitionOptions,
priority,
overrideWidth,
overrideHeight);
isThumbnailBuilt = true; isThumbnailBuilt = true;
// Recursively generate thumbnail requests. // Recursively generate thumbnail requests.
Request thumbRequest = Request thumbRequest =
thumbnailBuilder.buildRequestRecursive( thumbnailBuilder.buildRequestRecursive(
target, target,
targetListener,
coordinator, coordinator,
thumbTransitionOptions, thumbTransitionOptions,
thumbPriority, thumbPriority,
...@@ -819,27 +862,55 @@ public class RequestBuilder<TranscodeType> implements Cloneable { ...@@ -819,27 +862,55 @@ public class RequestBuilder<TranscodeType> implements Cloneable {
} else if (thumbSizeMultiplier != null) { } else if (thumbSizeMultiplier != null) {
// Base case: thumbnail multiplier generates a thumbnail request, but cannot recurse. // Base case: thumbnail multiplier generates a thumbnail request, but cannot recurse.
ThumbnailRequestCoordinator coordinator = new ThumbnailRequestCoordinator(parentCoordinator); ThumbnailRequestCoordinator coordinator = new ThumbnailRequestCoordinator(parentCoordinator);
Request fullRequest = obtainRequest(target, requestOptions, coordinator, transitionOptions, Request fullRequest =
priority, overrideWidth, overrideHeight); obtainRequest(
target,
targetListener,
requestOptions,
coordinator,
transitionOptions,
priority,
overrideWidth,
overrideHeight);
RequestOptions thumbnailOptions = requestOptions.clone() RequestOptions thumbnailOptions = requestOptions.clone()
.sizeMultiplier(thumbSizeMultiplier); .sizeMultiplier(thumbSizeMultiplier);
Request thumbnailRequest = obtainRequest(target, thumbnailOptions, coordinator, Request thumbnailRequest =
transitionOptions, getThumbnailPriority(priority), overrideWidth, overrideHeight); obtainRequest(
target,
targetListener,
thumbnailOptions,
coordinator,
transitionOptions,
getThumbnailPriority(priority),
overrideWidth,
overrideHeight);
coordinator.setRequests(fullRequest, thumbnailRequest); coordinator.setRequests(fullRequest, thumbnailRequest);
return coordinator; return coordinator;
} else { } else {
// Base case: no thumbnail. // Base case: no thumbnail.
return obtainRequest(target, requestOptions, parentCoordinator, transitionOptions, priority, return obtainRequest(
overrideWidth, overrideHeight); target,
targetListener,
requestOptions,
parentCoordinator,
transitionOptions,
priority,
overrideWidth,
overrideHeight);
} }
} }
private Request obtainRequest(Target<TranscodeType> target, private Request obtainRequest(
RequestOptions requestOptions, RequestCoordinator requestCoordinator, Target<TranscodeType> target,
TransitionOptions<?, ? super TranscodeType> transitionOptions, Priority priority, RequestListener<TranscodeType> targetListener,
int overrideWidth, int overrideHeight) { RequestOptions requestOptions,
RequestCoordinator requestCoordinator,
TransitionOptions<?, ? super TranscodeType> transitionOptions,
Priority priority,
int overrideWidth,
int overrideHeight) {
return SingleRequest.obtain( return SingleRequest.obtain(
context, context,
glideContext, glideContext,
...@@ -850,6 +921,7 @@ public class RequestBuilder<TranscodeType> implements Cloneable { ...@@ -850,6 +921,7 @@ public class RequestBuilder<TranscodeType> implements Cloneable {
overrideHeight, overrideHeight,
priority, priority,
target, target,
targetListener,
requestListener, requestListener,
requestCoordinator, requestCoordinator,
glideContext.getEngine(), glideContext.getEngine(),
......
...@@ -235,6 +235,7 @@ class DecodeJob<R> implements DataFetcherGenerator.FetcherReadyCallback, ...@@ -235,6 +235,7 @@ class DecodeJob<R> implements DataFetcherGenerator.FetcherReadyCallback,
} }
// When we're encoding we've already notified our callback and it isn't safe to do so again. // When we're encoding we've already notified our callback and it isn't safe to do so again.
if (stage != Stage.ENCODE) { if (stage != Stage.ENCODE) {
exceptions.add(e);
notifyFailed(); notifyFailed();
} }
if (!isCancelled) { if (!isCancelled) {
......
...@@ -3,9 +3,14 @@ package com.bumptech.glide.request; ...@@ -3,9 +3,14 @@ package com.bumptech.glide.request;
import android.graphics.drawable.Drawable; import android.graphics.drawable.Drawable;
import android.os.Handler; import android.os.Handler;
import android.support.annotation.Nullable; import android.support.annotation.Nullable;
import com.bumptech.glide.load.DataSource;
import com.bumptech.glide.load.engine.GlideException;
import com.bumptech.glide.request.target.SizeReadyCallback; import com.bumptech.glide.request.target.SizeReadyCallback;
import com.bumptech.glide.request.target.Target;
import com.bumptech.glide.request.transition.Transition; import com.bumptech.glide.request.transition.Transition;
import com.bumptech.glide.util.Util; import com.bumptech.glide.util.Util;
import java.io.PrintStream;
import java.io.PrintWriter;
import java.util.concurrent.CancellationException; import java.util.concurrent.CancellationException;
import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
...@@ -47,6 +52,7 @@ import java.util.concurrent.TimeoutException; ...@@ -47,6 +52,7 @@ import java.util.concurrent.TimeoutException;
* @param <R> The type of the resource that will be loaded. * @param <R> The type of the resource that will be loaded.
*/ */
public class RequestFutureTarget<R> implements FutureTarget<R>, public class RequestFutureTarget<R> implements FutureTarget<R>,
RequestListener<R>,
Runnable { Runnable {
private static final Waiter DEFAULT_WAITER = new Waiter(); private static final Waiter DEFAULT_WAITER = new Waiter();
...@@ -62,6 +68,7 @@ public class RequestFutureTarget<R> implements FutureTarget<R>, ...@@ -62,6 +68,7 @@ public class RequestFutureTarget<R> implements FutureTarget<R>,
private boolean isCancelled; private boolean isCancelled;
private boolean resultReceived; private boolean resultReceived;
private boolean loadFailed; private boolean loadFailed;
@Nullable private GlideException exception;
/** /**
* Constructor for a RequestFutureTarget. Should not be used directly. * Constructor for a RequestFutureTarget. Should not be used directly.
...@@ -162,8 +169,7 @@ public class RequestFutureTarget<R> implements FutureTarget<R>, ...@@ -162,8 +169,7 @@ public class RequestFutureTarget<R> implements FutureTarget<R>,
*/ */
@Override @Override
public synchronized void onLoadFailed(Drawable errorDrawable) { public synchronized void onLoadFailed(Drawable errorDrawable) {
loadFailed = true; // Ignored, synchronized for backwards compatibility.
waiter.notifyAll(this);
} }
/** /**
...@@ -171,10 +177,7 @@ public class RequestFutureTarget<R> implements FutureTarget<R>, ...@@ -171,10 +177,7 @@ public class RequestFutureTarget<R> implements FutureTarget<R>,
*/ */
@Override @Override
public synchronized void onResourceReady(R resource, Transition<? super R> transition) { public synchronized void onResourceReady(R resource, Transition<? super R> transition) {
// We might get a null result. // Ignored, synchronized for backwards compatibility.
resultReceived = true;
this.resource = resource;
waiter.notifyAll(this);
} }
private synchronized R doGet(Long timeoutMillis) private synchronized R doGet(Long timeoutMillis)
...@@ -186,7 +189,7 @@ public class RequestFutureTarget<R> implements FutureTarget<R>, ...@@ -186,7 +189,7 @@ public class RequestFutureTarget<R> implements FutureTarget<R>,
if (isCancelled) { if (isCancelled) {
throw new CancellationException(); throw new CancellationException();
} else if (loadFailed) { } else if (loadFailed) {
throw new ExecutionException(new IllegalStateException("Load failed")); throw new ExecutionException(exception);
} else if (resultReceived) { } else if (resultReceived) {
return resource; return resource;
} }
...@@ -200,7 +203,7 @@ public class RequestFutureTarget<R> implements FutureTarget<R>, ...@@ -200,7 +203,7 @@ public class RequestFutureTarget<R> implements FutureTarget<R>,
if (Thread.interrupted()) { if (Thread.interrupted()) {
throw new InterruptedException(); throw new InterruptedException();
} else if (loadFailed) { } else if (loadFailed) {
throw new ExecutionException(new IllegalStateException("Load failed")); throw new GlideExecutionException(exception);
} else if (isCancelled) { } else if (isCancelled) {
throw new CancellationException(); throw new CancellationException();
} else if (!resultReceived) { } else if (!resultReceived) {
...@@ -240,6 +243,25 @@ public class RequestFutureTarget<R> implements FutureTarget<R>, ...@@ -240,6 +243,25 @@ public class RequestFutureTarget<R> implements FutureTarget<R>,
// Do nothing. // Do nothing.
} }
@Override
public synchronized boolean onLoadFailed(
@Nullable GlideException e, Object model, Target<R> target, boolean isFirstResource) {
loadFailed = true;
exception = e;
waiter.notifyAll(this);
return false;
}
@Override
public synchronized boolean onResourceReady(
R resource, Object model, Target<R> target, DataSource dataSource, boolean isFirstResource) {
// We might get a null result.
resultReceived = true;
this.resource = resource;
waiter.notifyAll(this);
return false;
}
// Visible for testing. // Visible for testing.
static class Waiter { static class Waiter {
...@@ -251,4 +273,33 @@ public class RequestFutureTarget<R> implements FutureTarget<R>, ...@@ -251,4 +273,33 @@ public class RequestFutureTarget<R> implements FutureTarget<R>,
toNotify.notifyAll(); toNotify.notifyAll();
} }
} }
private static class GlideExecutionException extends ExecutionException {
private final GlideException cause;
GlideExecutionException(GlideException cause) {
super();
this.cause = cause;
}
@Override
public void printStackTrace() {
printStackTrace(System.err);
}
@Override
public void printStackTrace(PrintStream s) {
super.printStackTrace(s);
s.print("Caused by: ");
cause.printStackTrace(s);
}
@Override
public void printStackTrace(PrintWriter s) {
super.printStackTrace(s);
s.print("Caused by: ");
cause.printStackTrace(s);
}
}
} }
...@@ -85,6 +85,8 @@ public final class SingleRequest<R> implements Request, ...@@ -85,6 +85,8 @@ public final class SingleRequest<R> implements Request,
private final String tag = String.valueOf(super.hashCode()); private final String tag = String.valueOf(super.hashCode());
private final StateVerifier stateVerifier = StateVerifier.newInstance(); private final StateVerifier stateVerifier = StateVerifier.newInstance();
@Nullable
private RequestListener<R> targetListener;
private RequestCoordinator requestCoordinator; private RequestCoordinator requestCoordinator;
private Context context; private Context context;
private GlideContext glideContext; private GlideContext glideContext;
...@@ -119,6 +121,7 @@ public final class SingleRequest<R> implements Request, ...@@ -119,6 +121,7 @@ public final class SingleRequest<R> implements Request,
int overrideHeight, int overrideHeight,
Priority priority, Priority priority,
Target<R> target, Target<R> target,
RequestListener<R> targetListener,
RequestListener<R> requestListener, RequestListener<R> requestListener,
RequestCoordinator requestCoordinator, RequestCoordinator requestCoordinator,
Engine engine, Engine engine,
...@@ -138,6 +141,7 @@ public final class SingleRequest<R> implements Request, ...@@ -138,6 +141,7 @@ public final class SingleRequest<R> implements Request,
overrideHeight, overrideHeight,
priority, priority,
target, target,
targetListener,
requestListener, requestListener,
requestCoordinator, requestCoordinator,
engine, engine,
...@@ -160,6 +164,7 @@ public final class SingleRequest<R> implements Request, ...@@ -160,6 +164,7 @@ public final class SingleRequest<R> implements Request,
int overrideHeight, int overrideHeight,
Priority priority, Priority priority,
Target<R> target, Target<R> target,
RequestListener<R> targetListener,
RequestListener<R> requestListener, RequestListener<R> requestListener,
RequestCoordinator requestCoordinator, RequestCoordinator requestCoordinator,
Engine engine, Engine engine,
...@@ -173,6 +178,7 @@ public final class SingleRequest<R> implements Request, ...@@ -173,6 +178,7 @@ public final class SingleRequest<R> implements Request,
this.overrideHeight = overrideHeight; this.overrideHeight = overrideHeight;
this.priority = priority; this.priority = priority;
this.target = target; this.target = target;
this.targetListener = targetListener;
this.requestListener = requestListener; this.requestListener = requestListener;
this.requestCoordinator = requestCoordinator; this.requestCoordinator = requestCoordinator;
this.engine = engine; this.engine = engine;
...@@ -197,6 +203,7 @@ public final class SingleRequest<R> implements Request, ...@@ -197,6 +203,7 @@ public final class SingleRequest<R> implements Request,
overrideHeight = -1; overrideHeight = -1;
target = null; target = null;
requestListener = null; requestListener = null;
targetListener = null;
requestCoordinator = null; requestCoordinator = null;
animationFactory = null; animationFactory = null;
loadStatus = null; loadStatus = null;
...@@ -544,8 +551,10 @@ public final class SingleRequest<R> implements Request, ...@@ -544,8 +551,10 @@ public final class SingleRequest<R> implements Request,
isCallingCallbacks = true; isCallingCallbacks = true;
try { try {
if (requestListener == null if ((requestListener == null
|| !requestListener.onResourceReady(result, model, target, dataSource, isFirstResource)) { || !requestListener.onResourceReady(result, model, target, dataSource, isFirstResource))
&& (targetListener == null
|| !targetListener.onResourceReady(result, model, target, dataSource, isFirstResource))) {
Transition<? super R> animation = Transition<? super R> animation =
animationFactory.build(dataSource, isFirstResource); animationFactory.build(dataSource, isFirstResource);
target.onResourceReady(result, animation); target.onResourceReady(result, animation);
...@@ -581,8 +590,10 @@ public final class SingleRequest<R> implements Request, ...@@ -581,8 +590,10 @@ public final class SingleRequest<R> implements Request,
isCallingCallbacks = true; isCallingCallbacks = true;
try { try {
//TODO: what if this is a thumbnail request? //TODO: what if this is a thumbnail request?
if (requestListener == null if ((requestListener == null
|| !requestListener.onLoadFailed(e, model, target, isFirstReadyResource())) { || !requestListener.onLoadFailed(e, model, target, isFirstReadyResource()))
&& (targetListener == null
|| !targetListener.onLoadFailed(e, model, target, isFirstReadyResource()))) {
setErrorPlaceholder(); setErrorPlaceholder();
} }
} finally { } finally {
......
...@@ -13,6 +13,7 @@ import static org.mockito.Mockito.times; ...@@ -13,6 +13,7 @@ import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verify;
import android.os.Handler; import android.os.Handler;
import com.bumptech.glide.load.DataSource;
import com.bumptech.glide.request.target.SizeReadyCallback; import com.bumptech.glide.request.target.SizeReadyCallback;
import java.util.concurrent.CancellationException; import java.util.concurrent.CancellationException;
import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutionException;
...@@ -61,7 +62,12 @@ public class RequestFutureTargetTest { ...@@ -61,7 +62,12 @@ public class RequestFutureTargetTest {
@Test @Test
public void testReturnsTrueFromIsDoneIfDone() { public void testReturnsTrueFromIsDoneIfDone() {
future.onResourceReady(new Object(), null); future.onResourceReady(
/*resource=*/ new Object(),
/*model=*/ null,
/*target=*/future,
DataSource.DATA_DISK_CACHE,
true /*isFirstResource*/);
assertTrue(future.isDone()); assertTrue(future.isDone());
} }
...@@ -106,7 +112,12 @@ public class RequestFutureTargetTest { ...@@ -106,7 +112,12 @@ public class RequestFutureTargetTest {
@Test @Test
public void testDoesNotClearRequestIfCancelledAfterDone() { public void testDoesNotClearRequestIfCancelledAfterDone() {
future.onResourceReady(new Object(), null); future.onResourceReady(
/*resource=*/ new Object(),
/*model=*/ null,
/*target=*/future,
DataSource.DATA_DISK_CACHE,
true /*isFirstResource*/);
future.cancel(true); future.cancel(true);
verify(request, never()).clear(); verify(request, never()).clear();
...@@ -120,7 +131,12 @@ public class RequestFutureTargetTest { ...@@ -120,7 +131,12 @@ public class RequestFutureTargetTest {
@Test @Test
public void testReturnsFalseFromIsCancelledIfCancelledAfterDone() { public void testReturnsFalseFromIsCancelledIfCancelledAfterDone() {
future.onResourceReady(new Object(), null); future.onResourceReady(
/*resource=*/ new Object(),
/*model=*/ null,
/*target=*/future,
DataSource.DATA_DISK_CACHE,
true /*isFirstResource*/);
future.cancel(true); future.cancel(true);
assertFalse(future.isCancelled()); assertFalse(future.isCancelled());
...@@ -134,7 +150,12 @@ public class RequestFutureTargetTest { ...@@ -134,7 +150,12 @@ public class RequestFutureTargetTest {
@Test @Test
public void testReturnsFalseFromCancelIfDone() { public void testReturnsFalseFromCancelIfDone() {
future.onResourceReady(new Object(), null); future.onResourceReady(
/*resource=*/ new Object(),
/*model=*/ null,
/*target=*/future,
DataSource.DATA_DISK_CACHE,
true /*isFirstResource*/);
assertFalse(future.cancel(true)); assertFalse(future.cancel(true));
} }
...@@ -142,7 +163,12 @@ public class RequestFutureTargetTest { ...@@ -142,7 +163,12 @@ public class RequestFutureTargetTest {
public void testReturnsResourceOnGetIfAlreadyDone() public void testReturnsResourceOnGetIfAlreadyDone()
throws ExecutionException, InterruptedException { throws ExecutionException, InterruptedException {
Object expected = new Object(); Object expected = new Object();
future.onResourceReady(expected, null); future.onResourceReady(
/*resource=*/ expected,
/*model=*/ null,
/*target=*/future,
DataSource.DATA_DISK_CACHE,
true /*isFirstResource*/);
assertEquals(expected, future.get()); assertEquals(expected, future.get());
} }
...@@ -151,7 +177,12 @@ public class RequestFutureTargetTest { ...@@ -151,7 +177,12 @@ public class RequestFutureTargetTest {
public void testReturnsResourceOnGetWithTimeoutIfAlreadyDone() public void testReturnsResourceOnGetWithTimeoutIfAlreadyDone()
throws InterruptedException, ExecutionException, TimeoutException { throws InterruptedException, ExecutionException, TimeoutException {
Object expected = new Object(); Object expected = new Object();
future.onResourceReady(expected, null); future.onResourceReady(
/*resource=*/ expected,
/*model=*/ null,
/*target=*/future,
DataSource.DATA_DISK_CACHE,
true /*isFirstResource*/);
assertEquals(expected, future.get(100, TimeUnit.MILLISECONDS)); assertEquals(expected, future.get(100, TimeUnit.MILLISECONDS));
} }
...@@ -173,21 +204,21 @@ public class RequestFutureTargetTest { ...@@ -173,21 +204,21 @@ public class RequestFutureTargetTest {
@Test(expected = ExecutionException.class) @Test(expected = ExecutionException.class)
public void testThrowsExecutionExceptionOnGetIfExceptionBeforeGet() public void testThrowsExecutionExceptionOnGetIfExceptionBeforeGet()
throws ExecutionException, InterruptedException { throws ExecutionException, InterruptedException {
future.onLoadFailed(null); future.onLoadFailed(/*e=*/ null, /*model=*/ null, future, /*isFirstResource=*/ true);
future.get(); future.get();
} }
@Test(expected = ExecutionException.class) @Test(expected = ExecutionException.class)
public void testThrowsExecutionExceptionOnGetIfExceptionWithNullValueBeforeGet() public void testThrowsExecutionExceptionOnGetIfExceptionWithNullValueBeforeGet()
throws ExecutionException, InterruptedException, TimeoutException { throws ExecutionException, InterruptedException, TimeoutException {
future.onLoadFailed(null); future.onLoadFailed(/*e=*/ null, /*model=*/ null, future, /*isFirstResource=*/ true);
future.get(100, TimeUnit.MILLISECONDS); future.get(100, TimeUnit.MILLISECONDS);
} }
@Test(expected = ExecutionException.class) @Test(expected = ExecutionException.class)
public void testThrowsExecutionExceptionOnGetIfExceptionBeforeGetWithTimeout() public void testThrowsExecutionExceptionOnGetIfExceptionBeforeGetWithTimeout()
throws ExecutionException, InterruptedException, TimeoutException { throws ExecutionException, InterruptedException, TimeoutException {
future.onLoadFailed(null); future.onLoadFailed(/*e=*/ null, /*model=*/ null, future, /*isFirstResource=*/ true);
future.get(100, TimeUnit.MILLISECONDS); future.get(100, TimeUnit.MILLISECONDS);
} }
...@@ -208,7 +239,12 @@ public class RequestFutureTargetTest { ...@@ -208,7 +239,12 @@ public class RequestFutureTargetTest {
public void testGetSucceedsOnMainThreadIfDone() public void testGetSucceedsOnMainThreadIfDone()
throws ExecutionException, InterruptedException { throws ExecutionException, InterruptedException {
future = new RequestFutureTarget<>(handler, width, height, true, waiter); future = new RequestFutureTarget<>(handler, width, height, true, waiter);
future.onResourceReady(new Object(), null); future.onResourceReady(
/*resource=*/ new Object(),
/*model=*/ null,
/*target=*/future,
DataSource.DATA_DISK_CACHE,
true /*isFirstResource*/);
future.get(); future.get();
} }
...@@ -232,7 +268,7 @@ public class RequestFutureTargetTest { ...@@ -232,7 +268,7 @@ public class RequestFutureTargetTest {
doAnswer(new Answer<Void>() { doAnswer(new Answer<Void>() {
@Override @Override
public Void answer(InvocationOnMock invocationOnMock) throws Throwable { public Void answer(InvocationOnMock invocationOnMock) throws Throwable {
future.onLoadFailed(null); future.onLoadFailed(/*e=*/ null, /*model=*/ null, future, /*isFirstResource=*/ true);
return null; return null;
} }
}).when(waiter).waitForTimeout(eq(future), anyLong()); }).when(waiter).waitForTimeout(eq(future), anyLong());
...@@ -266,13 +302,18 @@ public class RequestFutureTargetTest { ...@@ -266,13 +302,18 @@ public class RequestFutureTargetTest {
@Test @Test
public void testNotifiesAllWhenLoadFails() { public void testNotifiesAllWhenLoadFails() {
future.onLoadFailed(null); future.onLoadFailed(/*e=*/ null, /*model=*/ null, future, /*isFirstResource=*/ true);
verify(waiter).notifyAll(eq(future)); verify(waiter).notifyAll(eq(future));
} }
@Test @Test
public void testNotifiesAllWhenResourceReady() { public void testNotifiesAllWhenResourceReady() {
future.onResourceReady(null, null); future.onResourceReady(
/*resource=*/ new Object(),
/*model=*/ null,
/*target=*/future,
DataSource.DATA_DISK_CACHE,
true /*isFirstResource*/);
verify(waiter).notifyAll(eq(future)); verify(waiter).notifyAll(eq(future));
} }
...@@ -297,7 +338,12 @@ public class RequestFutureTargetTest { ...@@ -297,7 +338,12 @@ public class RequestFutureTargetTest {
doAnswer(new Answer<Void>() { doAnswer(new Answer<Void>() {
@Override @Override
public Void answer(InvocationOnMock invocationOnMock) throws Throwable { public Void answer(InvocationOnMock invocationOnMock) throws Throwable {
future.onResourceReady(expected, null); future.onResourceReady(
/*resource=*/ expected,
/*model=*/ null,
/*target=*/future,
DataSource.DATA_DISK_CACHE,
true /*isFirstResource*/);
return null; return null;
} }
}).when(waiter).waitForTimeout(eq(future), anyLong()); }).when(waiter).waitForTimeout(eq(future), anyLong());
......
...@@ -1002,6 +1002,7 @@ public class SingleRequestTest { ...@@ -1002,6 +1002,7 @@ public class SingleRequestTest {
overrideHeight, overrideHeight,
priority, priority,
target, target,
/*targetListener=*/ null,
requestListener, requestListener,
requestCoordinator, requestCoordinator,
engine, engine,
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册