Может ли кто-нибудь сказать мне разницу TRUE?
Когда использовать Сервис или AsyncTask или Обработчик?
Ответ 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 Ссылка