Утечка контекста Android в AsyncTask - PullRequest
11 голосов
/ 19 ноября 2010

Если я правильно интерпретирую эту статью , передача контекста действия в AsyncTasks является потенциальной утечкой, поскольку действие может быть уничтожено во время выполнения задачи.

Как вы справляетесь с этим в AsyncTasks, которые не являются внутренними предложениями и нуждаются в доступе к ресурсам или для обновления пользовательского интерфейса?

Кроме того, как вы можете избежать утечки контекста, если вам нужны ссылки на диалоги прогресса для их отклонения?

1 Ответ

13 голосов
/ 19 ноября 2010

Если я правильно понимаю ваш вопрос: класс Java WeakReference или SoftReference хорошо подходит для такого типа ситуаций.Это позволит вам передать контекст AsyncTask, не препятствуя GC освобождать контекст при необходимости.

GC более охотно собирает WeakReferences, чем при сборе SoftReferences.

вместо:

FooTask myFooTask = new FooTask(myContext);

ваш код будет выглядеть так:

WeakReference<MyContextClass> myWeakContext = new WeakReference<MyContextClass>(myContext);
FooTask myFooTask = new FooTask(myWeakContext);

и в AsyncTask вместо:

myContext.someMethod();

ваш код будет выглядеть так:

myWeakContext.get().someMethod();
...