Skip to content

Commit 90896a8

Browse files
author
farfromrefug
committed
fix(android): ImagePipeline prefetch wait for finish
1 parent 47449cb commit 90896a8

File tree

1 file changed

+42
-11
lines changed

1 file changed

+42
-11
lines changed

src/image/index.android.ts

Lines changed: 42 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -235,12 +235,29 @@ export class ImagePipeline {
235235
try {
236236
const context = Utils.android.getApplicationContext();
237237
const requestManager = com.bumptech.glide.Glide.with(context);
238+
const requestBuilder = requestManager.asBitmap().load(uri);
239+
function clear() {
240+
if (futureTarget) {
241+
com.bumptech.glide.Glide.with(context).clear(futureTarget);
242+
}
243+
}
244+
// Build request listener that resolves the promise when resource is ready
245+
const listener = new com.bumptech.glide.request.RequestListener({
246+
onLoadFailed(e: any, model: any, target: any, isFirstResource: boolean): boolean {
247+
clear();
248+
reject(e);
249+
return true; // consumed
250+
},
251+
onResourceReady(resource: any, model: any, target: any, dataSource: any, isFirstResource: boolean): boolean {
252+
clear();
253+
254+
resolve();
255+
return true; // consumed
256+
}
257+
});
238258

239-
// Preload into memory cache
240-
requestManager.asBitmap().load(uri).preload();
241-
242-
// Give Glide time to load into memory
243-
setTimeout(() => resolve(), 100);
259+
// Kick the request off and keep a reference to the FutureTarget so it can be cleared.
260+
const futureTarget = requestBuilder.listener(listener).preload();
244261
} catch (error) {
245262
reject(error);
246263
}
@@ -252,13 +269,27 @@ export class ImagePipeline {
252269
try {
253270
const context = Utils.android.getApplicationContext();
254271
const requestManager = com.bumptech.glide.Glide.with(context);
255-
256-
if (toDiskCache) {
257-
requestManager.downloadOnly().load(uri).submit();
258-
} else {
259-
requestManager.asBitmap().load(uri).submit();
272+
const requestBuilder = toDiskCache ? requestManager.downloadOnly().load(uri) : requestManager.asBitmap().load(uri);
273+
function clear() {
274+
if (futureTarget) {
275+
com.bumptech.glide.Glide.with(context).clear(futureTarget);
276+
}
260277
}
261-
resolve();
278+
279+
const listener = new com.bumptech.glide.request.RequestListener({
280+
onLoadFailed(e: any, model: any, target: any, isFirstResource: boolean): boolean {
281+
clear();
282+
reject(e);
283+
return true;
284+
},
285+
onResourceReady(resource: any, model: any, target: any, dataSource: any, isFirstResource: boolean): boolean {
286+
clear();
287+
resolve();
288+
return true;
289+
}
290+
});
291+
292+
const futureTarget = requestBuilder.listener(listener).preload();
262293
} catch (error) {
263294
reject(error);
264295
}

0 commit comments

Comments
 (0)