diff --git a/integration/cronet/src/main/java/com/bumptech/glide/integration/cronet/ChromiumRequestSerializer.java b/integration/cronet/src/main/java/com/bumptech/glide/integration/cronet/ChromiumRequestSerializer.java index 4daae3d608..a2575bcc8f 100644 --- a/integration/cronet/src/main/java/com/bumptech/glide/integration/cronet/ChromiumRequestSerializer.java +++ b/integration/cronet/src/main/java/com/bumptech/glide/integration/cronet/ChromiumRequestSerializer.java @@ -91,14 +91,18 @@ public final int compareTo(PriorityRunnable another) { GLIDE_TO_CHROMIUM_PRIORITY.put(Priority.LOW, UrlRequest.Builder.REQUEST_PRIORITY_LOWEST); } - private final JobPool jobPool = new JobPool(); + private final JobPool jobPool; private final Map jobs = new HashMap<>(); private final CronetRequestFactory requestFactory; @Nullable private final DataLogger dataLogger; - ChromiumRequestSerializer(CronetRequestFactory requestFactory, @Nullable DataLogger dataLogger) { + ChromiumRequestSerializer( + CronetRequestFactory requestFactory, + @Nullable DataLogger dataLogger, + @Nullable GlideExecutor executor) { this.requestFactory = requestFactory; this.dataLogger = dataLogger; + this.jobPool = new JobPool(executor); } void startRequest(Priority priority, GlideUrl glideUrl, Listener listener) { @@ -178,6 +182,11 @@ private class Job extends Callback { private long responseStartTimeMs; private volatile boolean isCancelled; private BufferQueue.Builder builder; + @Nullable private final GlideExecutor executor; + + Job(@Nullable GlideExecutor executor) { + this.executor = executor; + } void init(GlideUrl glideUrl) { startTime = System.currentTimeMillis(); @@ -233,8 +242,7 @@ public void onReadCompleted( @Override public void onSucceeded(UrlRequest request, final UrlResponseInfo info) { - GLIDE_EXECUTOR_SUPPLIER - .get() + getExecutor() .execute( new PriorityRunnable(priority) { @Override @@ -251,8 +259,7 @@ public void run() { @Override public void onFailed( UrlRequest urlRequest, final UrlResponseInfo urlResponseInfo, final CronetException e) { - GLIDE_EXECUTOR_SUPPLIER - .get() + getExecutor() .execute( new PriorityRunnable(priority) { @Override @@ -264,8 +271,7 @@ public void run() { @Override public void onCanceled(UrlRequest urlRequest, @Nullable final UrlResponseInfo urlResponseInfo) { - GLIDE_EXECUTOR_SUPPLIER - .get() + getExecutor() .execute( new PriorityRunnable(priority) { @Override @@ -360,16 +366,29 @@ private void clearListeners() { isCancelled = false; } } + + private Executor getExecutor() { + if (this.executor == null) { + return GLIDE_EXECUTOR_SUPPLIER.get(); + } else { + return this.executor; + } + } } private class JobPool { private static final int MAX_POOL_SIZE = 50; private final ArrayDeque pool = new ArrayDeque<>(); + @Nullable private final GlideExecutor executor; + + public JobPool(@Nullable GlideExecutor executor) { + this.executor = executor; + } public synchronized Job get(GlideUrl glideUrl) { Job job = pool.poll(); if (job == null) { - job = new Job(); + job = new Job(this.executor); } job.init(glideUrl); return job; diff --git a/integration/cronet/src/main/java/com/bumptech/glide/integration/cronet/ChromiumUrlLoader.java b/integration/cronet/src/main/java/com/bumptech/glide/integration/cronet/ChromiumUrlLoader.java index acae780028..d92a82860b 100644 --- a/integration/cronet/src/main/java/com/bumptech/glide/integration/cronet/ChromiumUrlLoader.java +++ b/integration/cronet/src/main/java/com/bumptech/glide/integration/cronet/ChromiumUrlLoader.java @@ -3,6 +3,7 @@ import androidx.annotation.Nullable; import com.bumptech.glide.load.Options; import com.bumptech.glide.load.data.DataFetcher; +import com.bumptech.glide.load.engine.executor.GlideExecutor; import com.bumptech.glide.load.model.GlideUrl; import com.bumptech.glide.load.model.ModelLoader; import com.bumptech.glide.load.model.ModelLoaderFactory; @@ -29,7 +30,17 @@ public final class ChromiumUrlLoader implements ModelLoader { CronetRequestFactory requestFactory, @Nullable DataLogger dataLogger) { this.parser = parser; - requestSerializer = new ChromiumRequestSerializer(requestFactory, dataLogger); + requestSerializer = + new ChromiumRequestSerializer(requestFactory, dataLogger, /* executor= */ null); + } + + ChromiumUrlLoader( + ByteBufferParser parser, + CronetRequestFactory requestFactory, + @Nullable DataLogger dataLogger, + @Nullable GlideExecutor executor) { + this.parser = parser; + requestSerializer = new ChromiumRequestSerializer(requestFactory, dataLogger, executor); } @Override @@ -49,15 +60,26 @@ public static final class StreamFactory private CronetRequestFactory requestFactory; @Nullable private final DataLogger dataLogger; + @Nullable private final GlideExecutor executor; public StreamFactory(CronetRequestFactory requestFactory, @Nullable DataLogger dataLogger) { this.requestFactory = requestFactory; this.dataLogger = dataLogger; + this.executor = null; + } + + public StreamFactory( + CronetRequestFactory requestFactory, + @Nullable DataLogger dataLogger, + @Nullable GlideExecutor executor) { + this.requestFactory = requestFactory; + this.dataLogger = dataLogger; + this.executor = executor; } @Override public ModelLoader build(MultiModelLoaderFactory multiFactory) { - return new ChromiumUrlLoader<>(this /*parser*/, requestFactory, dataLogger); + return new ChromiumUrlLoader<>(/* parser= */ this, requestFactory, dataLogger, executor); } @Override @@ -80,15 +102,26 @@ public static final class ByteBufferFactory private CronetRequestFactory requestFactory; @Nullable private final DataLogger dataLogger; + @Nullable private final GlideExecutor executor; public ByteBufferFactory(CronetRequestFactory requestFactory, @Nullable DataLogger dataLogger) { this.requestFactory = requestFactory; this.dataLogger = dataLogger; + this.executor = null; + } + + public ByteBufferFactory( + CronetRequestFactory requestFactory, + @Nullable DataLogger dataLogger, + @Nullable GlideExecutor executor) { + this.requestFactory = requestFactory; + this.dataLogger = dataLogger; + this.executor = executor; } @Override public ModelLoader build(MultiModelLoaderFactory multiFactory) { - return new ChromiumUrlLoader<>(this /*parser*/, requestFactory, dataLogger); + return new ChromiumUrlLoader<>(/* parser= */ this, requestFactory, dataLogger, executor); } @Override diff --git a/integration/cronet/src/test/java/com/bumptech/glide/integration/cronet/ChromiumUrlFetcherTest.java b/integration/cronet/src/test/java/com/bumptech/glide/integration/cronet/ChromiumUrlFetcherTest.java index 8595e68e37..d4321062be 100644 --- a/integration/cronet/src/test/java/com/bumptech/glide/integration/cronet/ChromiumUrlFetcherTest.java +++ b/integration/cronet/src/test/java/com/bumptech/glide/integration/cronet/ChromiumUrlFetcherTest.java @@ -87,7 +87,9 @@ public ByteBuffer answer(InvocationOnMock invocation) throws Throwable { glideUrl = new GlideUrl("http://www.google.com"); urlRequestListenerCaptor = ArgumentCaptor.forClass(UrlRequest.Callback.class); - serializer = new ChromiumRequestSerializer(cronetRequestFactory, null /*dataLogger*/); + serializer = + new ChromiumRequestSerializer( + cronetRequestFactory, /* dataLogger= */ null, /* executor= */ null); fetcher = new ChromiumUrlFetcher<>(serializer, parser, glideUrl); builder = cronetEngine.newUrlRequestBuilder(