Android - правильный способ использования AsyncTasks? - PullRequest
5 голосов
/ 05 октября 2011

Как правильно использовать асинктаски?Допустим, пользователь входит в действие, и запускается asynctask, и во время работы asynctask пользователь решает перейти на другую страницу.

  • Что будет с anynctask?он будет работать до тех пор, пока не будет завершен?
  • Я несу ответственность за то, чтобы как-то остановить эту асинхронную задачу?

Ответы [ 3 ]

5 голосов
/ 05 октября 2011

Asynctask будет продолжать работать.Asynctask может умереть, так как ОС Android пытается восстановить память, когда она заканчивается.Если вам все равно, что асинхронная задача может не завершиться, возможно, это не имеет значения, но это плохая практика.

Также, возможно, когда асинхронная задача умирает в зависимости от того, как вы сохраняете / обрабатываете результат, вы рискуете попытаться отредактировать действие / объекты в этом действии, которых больше нет, что приведет к нулевым ошибкам и другим плохимвещи. правильный способ сделать это состоит в том, чтобы запустить службу из вашей деятельности и запустить асинктическую задачу из службы.Вы должны следовать одному из шаблонов дизайна, изложенных в этом выступлении, представленном в Google IO 2010:

Шаблоны проектирования клиента Android REST

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

Загрузка данных с помощью служб

Кроме того, android будет управлять пулом потоков ваших асинхронных задачдля вас (я верю, что они начнут убивать их, когда у вас будет больше 5 в вашем процессе), вам не нужно их убивать.Проверьте ответ здесь:

Как умирают AsyncTasks

0 голосов
/ 05 октября 2011
  1. Да, AsyncTask будет продолжать выполняться, если вы не остановили его при переходе к другому действию.Он будет продолжать работать, даже если конфигурация устройства изменится (например, он вращается).Если вы хотите сделать что-то с postExecute (), которое повлияет на пользовательский интерфейс, то вы должны убедиться, что ссылки на виджеты пользовательского интерфейса, которые вы изменяете в этом методе, действительны даже после поворота, когда действие воссоздается.

  2. Да, вы несете ответственность за остановку (то есть .cancel ()) вашего AsyncTask, если он вам не нужен.Однако обратите внимание, что AsyncTask, который находится в середине его выполнения, не остановится только потому, что вы вызвали .cancel () для него.Он продолжит работу, но его метод postExecute () не будет вызываться при завершении задачи.

0 голосов
/ 05 октября 2011

Хорошо, я постараюсь быть быстрее:

  • Вы должны нести ответственность за остановку асинхронной задачи, если она не оказывает негативного влияния на вашу программу. Читать это .

  • Ваша асинктическая задача прошла бы, выполнив onPreExecute () - doInBackground (Params ...) - onPostExecute (Result) - Конец жизни асинхронной задачи

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