Когда использовать Сервис или AsyncTask или Обработчик? - PullRequest
31 голосов
/ 18 февраля 2010

Может кто-нибудь сказать мне разницу ИСТИНА ?

Ответы [ 5 ]

24 голосов
/ 18 февраля 2010

Мое эмпирическое правило заключается в том, что AsyncTask - это когда я хочу сделать что-то привязанное к одиночному Activity, а Service - для того, когда я хочу сделать что-то, что будет продолжено после действия, которое его начало в фоновом режиме.

Так что, если я хочу сделать небольшую часть фоновой обработки в Activity без привязки интерфейса, я буду использовать AsyncTask. Затем я буду использовать значение по умолчанию Handler из этого Activity для передачи сообщений обратно, чтобы гарантировать, что обновления происходят в главном потоке. Обработка обновлений в главном потоке имеет два преимущества: обновления пользовательского интерфейса происходят правильно, и вам не нужно сильно беспокоиться о проблемах синхронизации.

Если, например, я захочу сделать загрузку, которая может занять некоторое время, я бы использовал Service. Поэтому, если я перешел к другому Activity в моем приложении или к другому приложению полностью, мой Service мог бы продолжать работать и продолжать загружать файл, чтобы он был готов, когда я вернусь к своему приложению. В этом случае я бы, вероятно, использовал бы Уведомление о статусной строке после завершения загрузки, чтобы пользователь мог вернуться к моему приложению, когда ему будет удобно.

Что вы найдете, если вы используете AsyncTask для длительного процесса, он может продолжиться после того, как вы ушли от Activity, но:

  • Если Activity находится в фоновом режиме, когда ваша обработка завершена, у вас могут возникнуть проблемы при попытке обновить пользовательский интерфейс с результатами и т. Д.
  • Фон Activity с большей вероятностью будет убит Android, когда ему требуется память, чем Service.
13 голосов
/ 18 февраля 2010

Используйте Сервис , когда у вас есть что-то, что должно работать в фоновом режиме в течение продолжительных периодов времени. Это не связано с какой-либо деятельностью. Каноническим примером является музыкальный проигрыватель.
AsyncTask отлично подходит, когда некоторые вещи нужно выполнять в фоновом режиме во время текущей деятельности. Например. загрузка, поиск текста внутри файла и т. д.
Лично я использую Обработчики только для публикации изменений в ветке пользовательского интерфейса. Например. Вы делаете некоторые вычисления в фоновом потоке и публикуете результат через обработчик.

Суть: в большинстве случаев AsyncTask - это то, что вам нужно.

5 голосов
/ 08 марта 2011

В дополнение к другим ответам здесь, касающимся различия между службой и AsyncTask, также стоит отметить [0]:

  • Служба не является отдельным процессом.Сам объект Service не подразумевает, что он работает в своем собственном процессе;если не указано иное, он выполняется в том же процессе, что и приложение, частью которого он является.
  • Служба не является потоком.Это не средство само по себе выполнять работу из основного потока (во избежание ошибок Application Not Responding).

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

Вместо книги, я бы сказал, руководство для разработчиков содержит множество хороших ответов.

[0] Источник: http://developer.android.com/reference/android/app/Service.html#WhatIsAService

4 голосов
/ 19 августа 2011
  • AsyncTask: Когда я хочу сделать что-то без зависания пользовательского интерфейса и отразить изменения в пользовательском интерфейсе.

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

  • Служба: Если я хочу сделать что-то в фоновом режиме, не требующее обновления пользовательского интерфейса, используйте Службу. Не имеет значения, находится приложение на переднем плане или на заднем плане.

Например: Когда любое приложение, загруженное с Android Market, отображает уведомление в строке состояния, а пользовательский интерфейс возвращается на предыдущую страницу и позволяет выполнять другие действия.

1 голос
/ 28 августа 2017

Услуги

Служба - это компонент приложения, который может выполнять длительные операции в фоновом режиме и не предоставляет пользовательский интерфейс. Другой компонент приложения может запустить службу, и он будет продолжать работать в фоновом режиме, даже если пользователь переключается на другое приложение. Кроме того, компонент может связываться со службой для взаимодействия с ним.

Когда использовать?

Задача без пользовательского интерфейса, но не должна быть слишком длинной. Используйте потоки в сервисе для длинных задач. Долгое задание в целом.

Триггер: Вызов метода onStartService ()

Инициируется с: Любая тема

Работает на: Основной поток процесса его размещения. Служба не создает свой собственный поток и не запускается в отдельном процессе (если не указано иное)

Ограничения / Недостатки: Может блокировать основной поток


AsyncTask

AsyncTask обеспечивает правильное и простое использование потока пользовательского интерфейса. Этот класс позволяет выполнять фоновые операции и публиковать результаты в потоке пользовательского интерфейса без необходимости манипулировать потоками и / или обработчиками. Асинхронная задача определяется вычислением, которое выполняется в фоновом потоке и результаты которого публикуются в потоке пользовательского интерфейса.

Когда использовать?

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

Триггер: Вызов метода execute ()

Инициируется с: Основная тема

Работает на: Рабочий поток. Тем не менее, методы промежуточного потока могут быть вызваны для публикации прогресса.

Ограничения / Недостатки:

  • Один экземпляр может быть выполнен только один раз (следовательно, не может выполняться в цикле)
  • Должен быть создан и выполнен из основного потока

Ссылка Ссылка

...