Skip to content

Commit 2c3502c

Browse files
author
farfromrefug
committed
fix(android): crash in prefetchToMemoryCache and prefetchToDiskCache
1 parent b7aae14 commit 2c3502c

File tree

1 file changed

+23
-12
lines changed

1 file changed

+23
-12
lines changed

src/image/index.android.ts

Lines changed: 23 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -236,28 +236,31 @@ export class ImagePipeline {
236236
const context = Utils.android.getApplicationContext();
237237
const requestManager = com.bumptech.glide.Glide.with(context);
238238
const requestBuilder = requestManager.asBitmap().load(uri);
239-
function clear() {
239+
240+
let futureTarget = null;
241+
function clearLater() {
240242
if (futureTarget) {
241-
com.bumptech.glide.Glide.with(context).clear(futureTarget);
243+
setTimeout(() => {
244+
com.bumptech.glide.Glide.with(context).clear(futureTarget);
245+
}, 0);
242246
}
243247
}
244-
// Build request listener that resolves the promise when resource is ready
248+
245249
const listener = new com.bumptech.glide.request.RequestListener({
246250
onLoadFailed(e: any, model: any, target: any, isFirstResource: boolean): boolean {
247-
clear();
251+
clearLater();
248252
reject(e);
249253
return true; // consumed
250254
},
251255
onResourceReady(resource: any, model: any, target: any, dataSource: any, isFirstResource: boolean): boolean {
252-
clear();
253-
256+
clearLater();
254257
resolve();
255258
return true; // consumed
256259
}
257260
});
258261

259262
// Kick the request off and keep a reference to the FutureTarget so it can be cleared.
260-
const futureTarget = requestBuilder.listener(listener).preload();
263+
futureTarget = requestBuilder.listener(listener).preload();
261264
} catch (error) {
262265
reject(error);
263266
}
@@ -270,26 +273,34 @@ export class ImagePipeline {
270273
const context = Utils.android.getApplicationContext();
271274
const requestManager = com.bumptech.glide.Glide.with(context);
272275
const requestBuilder = toDiskCache ? requestManager.downloadOnly().load(uri) : requestManager.asBitmap().load(uri);
273-
function clear() {
276+
277+
let futureTarget = null;
278+
function clearLater() {
274279
if (futureTarget) {
275-
com.bumptech.glide.Glide.with(context).clear(futureTarget);
280+
setTimeout(() => {
281+
try {
282+
com.bumptech.glide.Glide.with(context).clear(futureTarget);
283+
} catch (err) {
284+
// ignore
285+
}
286+
}, 0);
276287
}
277288
}
278289

279290
const listener = new com.bumptech.glide.request.RequestListener({
280291
onLoadFailed(e: any, model: any, target: any, isFirstResource: boolean): boolean {
281-
clear();
292+
clearLater();
282293
reject(e);
283294
return true;
284295
},
285296
onResourceReady(resource: any, model: any, target: any, dataSource: any, isFirstResource: boolean): boolean {
286-
clear();
297+
clearLater();
287298
resolve();
288299
return true;
289300
}
290301
});
291302

292-
const futureTarget = requestBuilder.listener(listener).preload();
303+
futureTarget = requestBuilder.listener(listener).preload();
293304
} catch (error) {
294305
reject(error);
295306
}

0 commit comments

Comments
 (0)