Подтвердить что ты не робот

Когда использовать Сервис или AsyncTask или Обработчик?

Может ли кто-нибудь сказать мне разницу TRUE?

4b9b3361

Ответ 1

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

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

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

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

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

Ответ 2

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

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

Ответ 3

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

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

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

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

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

Ответ 4

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

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

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

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

Ответ 5

Сервис

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

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

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

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

Сгенерировано из: Любой поток

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

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


AsyncTask

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

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

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

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

Запущен из: Основной поток

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

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

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

Ref Ссылка