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

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

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

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


person hpique    schedule 18.11.2010    source источник
comment
Посмотрите на это. Речь идет об изменении ориентации, но это связано с безопасным сохранением ссылки на действие/контекст.   -  person Kevin Gaudin    schedule 19.11.2010


Ответы (1)


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

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();
person Tom Neyland    schedule 18.11.2010
comment
просто убедитесь, что myWeakContext.get() не возвращает null, иначе вы облажались. - person Radu Comaneci; 26.06.2013
comment
Это работает, если вам не нужно делать обновления пользовательского интерфейса после завершения задачи. Если результаты асинхронной задачи необходимы после повторного создания действия, вам потребуется использовать другой подход. Безголовые фрагменты, настроенные на сохранение состояния, могут управлять вашими задачами. - person r1k0; 19.01.2015