mirror of
https://github.com/androidx/media.git
synced 2025-05-05 06:30:24 +08:00
Explicitly null out LoadTask.callback on release
As highlighted by the ref'd issue, we can end up with memory leaks if Loadable.load implementations take a long time to return upon cancelation. This change cuts off one of the two problematic reference chains. This doesn't do much about the ref'd issue, since there's a second reference chain that's much harder to deal with: Thread->LoadTask->loadable. But since it's easy just to cut this one off, I figure it makes sense to do so. Issue: #4249 ------------- Created by MOE: https://github.com/google/moe MOE_MIGRATED_REVID=198735386
This commit is contained in:
parent
27f009d239
commit
69b4aa9e36
@ -250,11 +250,12 @@ public final class Loader implements LoaderErrorThrower {
|
|||||||
private static final int MSG_IO_EXCEPTION = 3;
|
private static final int MSG_IO_EXCEPTION = 3;
|
||||||
private static final int MSG_FATAL_ERROR = 4;
|
private static final int MSG_FATAL_ERROR = 4;
|
||||||
|
|
||||||
private final T loadable;
|
|
||||||
private final Loader.Callback<T> callback;
|
|
||||||
public final int defaultMinRetryCount;
|
public final int defaultMinRetryCount;
|
||||||
|
|
||||||
|
private final T loadable;
|
||||||
private final long startTimeMs;
|
private final long startTimeMs;
|
||||||
|
|
||||||
|
private @Nullable Loader.Callback<T> callback;
|
||||||
private IOException currentError;
|
private IOException currentError;
|
||||||
private int errorCount;
|
private int errorCount;
|
||||||
|
|
||||||
@ -304,6 +305,11 @@ public final class Loader implements LoaderErrorThrower {
|
|||||||
finish();
|
finish();
|
||||||
long nowMs = SystemClock.elapsedRealtime();
|
long nowMs = SystemClock.elapsedRealtime();
|
||||||
callback.onLoadCanceled(loadable, nowMs, nowMs - startTimeMs, true);
|
callback.onLoadCanceled(loadable, nowMs, nowMs - startTimeMs, true);
|
||||||
|
// If loading, this task will be referenced from a GC root (the loading thread) until
|
||||||
|
// cancellation completes. The time taken for cancellation to complete depends on the
|
||||||
|
// implementation of the Loadable that the task is loading. We null the callback reference
|
||||||
|
// here so that it doesn't prevent garbage collection whilst cancellation is ongoing.
|
||||||
|
callback = null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user