Утечка контекста Android в AsyncTask

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

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

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

Ответ 1

Если я правильно понимаю ваш вопрос: класс 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();