Можно ли установить ссылку на AsyncTask в null в onPostExecute ()? - PullRequest
3 голосов
/ 21 марта 2012

У меня есть класс Activity, у которого есть атрибут, который ссылается на экземпляр AsyncTask, и этот AsyncTask также имеет ссылку на это действие.

Из AsyncTask onPostExecute() Я хочу установить ссылку изActivity для AsyncTask в null (через ссылку, которая имеет экземпляр AsyncTask для Activity).Это хорошая практика?

Я делаю это в последней строке кода метода, потому что я на самом деле говорю сборщику мусора, что он может удалить этот экземпляр, так как на него больше не ссылаются другиеобъект (Деятельность).Это правильно, или я не прав?

Редактировать: Мой ответ ниже возобновляет окончательное решение, которое я использовал.

Спасибо!

Ответы [ 2 ]

4 голосов
/ 27 марта 2012

После большой дискуссии с @SavvasDalkitsis см. его ответ и комментарии Я нашел ответ, который удовлетворяет моим требованиям. Я хотел обнулить AsyncTask после его завершения по двум причинам:

  1. Чтобы узнать, закончил ли он
  2. Чтобы больше не перерабатывать его, так как он не нужен, если он был выполнен один раз

На самом деле нет необходимости устанавливать AsyncTask в null после его завершения (если используется правильный подход - добавление нового действия при изменении чередования, чтобы избежать утечек памяти), чтобы знать, что оно завершено. Вместо этого мы можем проверить его статус. Таким образом, мы узнаем, закончил он или нет. Затем в onCreate() после вызова метода getLastNonConfigurationChange() мы также можем проверить это и установить его в null, если он закончен, чтобы больше не перерабатывать его:

if (mTask == null || mTask.getStatus().equals(AsyncTask.Status.FINISHED)) {
    mTask = null;
} else {
    mTask.attach(this);
}

Надеюсь, это поможет кому-то еще! :)

1 голос
/ 21 марта 2012

Зачем вам в первую очередь сохранять ссылку на AsyncTask?

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

Я хочу сказать, что вы можете запустить асинхронную задачу без ссылки на нее, и ваша проблема исчезнет. Но если по какой-то причине вам нужна ссылка, то, объясняя ваш конкретный случай более подробно, мы можем предложить лучшее решение.

EDIT

Ваша главная забота - не утечка активности, а не наоборот. Если вы действительно хотите очистить все ссылки должным образом, я бы предоставил метод присоединения / отсоединения для асинхронной задачи, чтобы действия могли присоединяться и отсоединяться от асинхронной задачи, когда это необходимо, а также предоставлял метод для действия, которое сводит на нет асинхронную задачу. отзовитесь и вызовите это из своей асинхронной задачи, если действие все еще присоединено. Не делай этого напрямую. Асинхронная задача не должна изменять действие напрямую. Если возможно, даже переместите асинхронную задачу в новый файл, не делайте его внутренним классом действия, который кричит об утечках.

...