Параметры AsyncTask.onPostExecute () в сравнении с переменной экземпляра - PullRequest
5 голосов
/ 24 января 2012

Работа над моим AsyncTask Мне интересно, почему я должен использовать параметр onPostExecute(), когда я могу просто использовать переменную экземпляра уровня класса в своем классе AsyncTask для обмена данными между doInBackground() и onPostExecute() .

Обе работы, но есть ли плюсы и минусы для каждого подхода?

Редактировать: когда я говорю «переменная экземпляра», я говорю о закрытой переменной экземпляра в расширенном классе AsyncTask. Когда класс умирает, переменная экземпляра тоже умирает.

Ответы [ 4 ]

5 голосов
/ 24 января 2012

Что ж, это может уменьшить вероятность утечки памяти, поскольку вы не держите ссылку на свой объект на уровне класса, а только те методы AsyncTask.

Это также устранит проблемы синхронизации, так как@nico_ekito упоминается

1 голос
/ 10 февраля 2012

Я обнаружил, что использование переменных экземпляра в AsyncTask не является потокобезопасным. В моем случае, если бы я поймал и Exception в doInBackground (), я бы установил для него переменную экземпляра Exync в AsyncTask. Затем я бы проверил, была ли переменная нулевой или нет в onPostExecute () (я не отменяю (), потому что я могу захотеть отобразить сообщение в исключении для пользователя).

В любом случае, время от времени я регистрирую, что я перехватил исключение в doInBackground, но в onPostExecute переменная экземпляра будет нулевой. В документации сказано, что методы вызываются синхронно, поэтому я не могу объяснить ПОЧЕМУ это происходит, но я видел, как это происходило несколько раз.

Наконец, я изменил свой класс "Result", чтобы он содержал как исключение, так и исходный результат, который я хотел передать onPostExecute. Это прекрасно работает.

0 голосов
/ 18 февраля 2016

Позвольте мне не согласиться с принятым ответом (и другими). ​​

Нет абсолютно никаких проблем с безопасностью потоков при использовании полей экземпляра в AsyncTask для передачи значений из одного обратного вызова в другой. Обычно это означает передачу значений от doInBackground() до onPostExecute(). Обратные вызовы в AsyncTask гарантированно никогда не будут выполняться одновременно, поэтому нет условий состязания, также нет возможности для поля экземпляра быть потерянным или нулевым, если оно было установлено в ранее выполненном обратном вызове. Теперь к ответу.

Плюсы onPostExecute() Параметр:

  • Параметр берется из возвращаемого значения doInBackground(), которое гарантирует, что doInBackground() должно предоставить значение при возврате, гарантируя, что оно никогда не будет забыто
  • Параметр представляет собой четко установленную связь между doInBackground() и последующими обратными вызовами: onPostExecute() и onCancelled(), поле экземпляра может служить нескольким возможным целям

Минусы onPostExecute() Параметр:

  • Это один параметр, поэтому вы не можете передать два или более значений, в качестве обходного пути вы можете обернуть несколько значений в класс своего создания или, возможно, Pair

Плюсы и минусы использования поля экземпляра для передачи значений от doInBackground() до onPostExecute() в основном являются точными обратными вышеприведенным.

0 голосов
/ 24 января 2012

а также другие причины размещены;если вы получаете исключение в doInBackground(), вы можете просто передать параметр, представляющий ошибку, в onPostExecute() и отменить любую дополнительную работу, вместо того, чтобы получать другое исключение, когда вы понимаете, что все ваши переменные не были созданы должным образом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...