В некоторых случаях можно выполнить одну и ту же задачу с помощью либо, AsyncTask
либо, Service
но обычно один лучше подходит для задачи, чем другой.
AsyncTask
s предназначены для однократных трудоемких задач, которые нельзя запустить из потока пользовательского интерфейса. Типичный пример - выборка / обработка данных при нажатии кнопки.
Service
s предназначены для непрерывной работы в фоновом режиме. В приведенном выше примере выборки данных при нажатии кнопки вы можете запустить службу, позволить ей получить данные, а затем остановить ее, но это неэффективно. Гораздо быстрее использовать AsyncTask
тот, который запустится один раз, вернет данные и все будет готово.
Однако, если вам нужно постоянно что-то делать в фоновом режиме, Service
лучше всего использовать a . Примеры этого включают воспроизведение музыки, постоянную проверку наличия новых данных и т. Д.
Кроме того, как уже сказал Шериф, службы не обязательно запускаются из потока пользовательского интерфейса.
По большей части Service
s используются, когда вы хотите запустить код, даже когда ваше приложение Activity
не открыто. AsyncTask
s предназначены для невероятно простого выполнения кода из потока пользовательского интерфейса.
Сервисы совершенно разные: Сервисы - это не потоки !
Ваше действие привязывается к службе, и служба содержит некоторые функции, которые при вызове блокируют вызывающий поток. Ваш сервис может быть использован для изменения температуры с Цельсия на Градусы. Любое связывающее действие может получить эту услугу.
Однако
AsyncTask
это поток, который выполняет некоторую работу в фоновом режиме и в то же время имеет возможность сообщать результаты обратно вызывающему потоку.Подумать только: услуга может иметь
AsyncTask
объект!источник
Service
является одним из компонентов платформы Android, для выполнения которого не требуется пользовательский интерфейс, что означает, что даже когда приложение активно не используется пользователем, вы можете выполнять некоторые операции со службой. Это не означает, что служба будет работать в отдельном потоке, но она выполняется в основном потоке, и при необходимости операция может выполняться в отдельном потоке. Примеры использования: воспроизведение музыки в фоновом режиме, синхронизация данных с сервером в фоновом режиме без взаимодействия с пользователем и т. Д.AsyncTask
с другой стороны, используется для выполнения задач блокировки пользовательского интерфейса в отдельном потоке. Это похоже на создание нового потока и выполнение задачи, когда все задачи по созданию и обслуживанию потоков и отправке результата в основной поток выполняются с помощью использования AsyncTask. Пример: выборка данных с сервера, операции CRUD на преобразователе контента и т. Д.источник
Служба и асинтаксические задачи делают почти одно и то же, почти. Использование службы или асинтаксической задачи зависит от ваших требований.
в качестве примера, если вы хотите загрузить данные в список с сервера после нажатия какой-либо кнопки или изменения экрана, вам лучше использовать asynctask. он работает параллельно с основным потоком пользовательского интерфейса (выполняется в фоновом режиме). для запуска активности asynctack, или ваше приложение должно в основном потоке пользовательского интерфейса. после выхода из приложения нет асинтаксиса.
Но службы не такие, как только вы запустите службу, она может работать после выхода из приложения, если вы не остановите службу. Как я сказал, это зависит от ваших требований. Если вы хотите продолжать проверять получение данных или проверять состояние сети постоянно вам лучше идти со службой.
счастливого кодирования.
источник
В некоторых случаях вы можете достичь той же функциональности, используя оба. В отличие от асинхронной задачи, служба имеет собственный жизненный цикл и наследует контекст (служба более надежна, чем асинхронная задача). Сервис может работать, даже если вы вышли из приложения. Если вы хотите что-то сделать даже после закрытия приложения, а также вам нужна переменная контекста, вы выберете Service.
Пример: если вы хотите воспроизвести музыку и не хотите останавливаться, если пользователь покидает приложение, вы обязательно перейдете на Сервис.
источник
Сравнение локальной внутрипроцессной службы базового класса ✱ с
AsyncTask
:✱ (Этот ответ не обращается на экспорт услуг, или любую услугу , которая выполняется в процессе , отличном от клиента, так как ожидаемых случаев использования существенно отличаются от тех ,
AsyncTask
. Кроме того , в интересах краткости, характер некоторых специализированныхService
подклассы (например,IntentService
,JobService
) будут проигнорированы здесь.)Срок службы процесса
A
Service
представляет для ОС «желание приложения выполнять более длительную операцию, не взаимодействуя с пользователем» [ ref ].Пока у вас
Service
работает, Android понимает, что вы не хотите, чтобы ваш процесс был убит. Это также верно, когда у вас естьActivity
экранное меню, и это особенно верно, когда вы запускаете службу переднего плана . (Когда все компоненты вашего приложения уходят, Android думает: «О, сейчас хорошее время, чтобы убить это приложение, чтобы я мог освободить ресурсы».)Кроме того, в зависимости от последнего возвращаемого значения
Service.onCreate()
Android может попытаться «оживить» приложения / службы, которые были отключены из-за нехватки ресурсов [ ref ].AsyncTasks
не делай ничего из этого. Неважно, сколько фоновых потоков у вас запущено или насколько усердно они работают: Android не будет поддерживать ваше приложение в рабочем состоянии только потому, что ваше приложение использует процессор. Он должен каким-то образом знать, что вашему приложению еще есть над чем поработать; поэтомуServices
зарегистрированы в ОС, аAsyncTasks
не зарегистрированы.Многопоточность
AsyncTasks
все о создании фонового потока, над которым нужно работать, и последующем представлении результата этой работы потоку пользовательского интерфейса в поточно-ориентированной манере.Каждое новое
AsyncTask
выполнение обычно приводит к большему количеству параллелизма (большему количеству потоков) с учетом ограниченийAsyncTasks's
пула потоков [ ref ].Service
методы, с другой стороны, всегда вызываются в потоке пользовательского интерфейса [ ref ]. Это относится и кonCreate()
,onStartCommand()
,onDestroy()
,onServiceConnected()
и т.д. Таким образом, в некотором смысле,Services
не «запустить» в фоновом режиме. Как только они запускаются (onCreate()
), они просто «сидят» там - пока не пришло время очистить, выполнить иonStartCommand()
т. Д.Другими словами, добавление дополнительных
Services
не приводит к большему параллелизму. Методы обслуживания не подходят для выполнения большого объема работы, потому что они выполняются в потоке пользовательского интерфейса .Конечно, вы можете расширять
Service
, добавлять свои собственные методы и вызывать их из любого потока. Но если вы это сделаете, ответственность за безопасность потоков лежит на вас, а не на структуре.Если вы хотите добавить к себе фоновый поток (или какой-либо другой рабочий)
Service
, вы можете это сделать. Например, вы можете запустить фоновый поток /AsyncTask
inService.onCreate()
. Но не для всех случаев использования это требуется. Например:Service
работу, чтобы продолжать получать обновления местоположения в «фоновом режиме» (то есть, не обязательно наActivities
экране).BroadcastReceiver
регистрацию на долгосрочной основе (после API 26 вы не всегда можете делать это через манифест, поэтому вам нужно зарегистрироваться во время выполнения). [ ref ]).Ни один из этих вариантов использования не требует большой загрузки процессора; они просто требуют, чтобы приложение не было убито .
Как рабочие
Services
не ориентированы на задачу. Они не настроены «выполнять задачу» и «приносить результат», какAsyncTasks
они.Services
не решают никаких проблем безопасности потоков (несмотря на то, что все методы выполняются в одном потоке).AsyncTasks
, с другой стороны, справитесь с этой сложностью за вас.Обратите внимание, что
AsyncTask
эта функция устарела . Но это не означает , что вам следует заменить вашиAsyncTasks
сServices
! (Если вы что-то узнали из этого ответа, это должно быть ясно.)TL; DR
Services
в основном существуют, чтобы «существовать». Они похожи на заклинаниеActivity
, заставляя приложение оставаться в живых, в то время как другие компоненты делают «работу».AsyncTasks
«работают», но сами по себе они не будут поддерживать процесс.источник