Разница между обслуживанием, асинхронной задачей и потоком?


147

В чем разница между Service, Async Task & Thread. Если я не ошибаюсь, все они используются, чтобы делать некоторые вещи в фоновом режиме. Итак, как решить, что использовать и когда?


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

Ответы:


186

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

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

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

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

Я часто пользуюсь Сервисами, AsyncTasks. Меньше или меньше, так как я могу сделать почти все с AsyncTask.


1
Спасибо за ваше объяснение. Итак, если мне нужно создать приложение, которое извлекает данные из Интернета, что будет лучшим вариантом обслуживания или асинхронной задачей?
SpunkerBaba

16
Вы должны использовать оба. Вы создаете Сервис и внутри которого вы используете AsyncTask.
Pentium10

4
Добавьте к ответу выше, AsyncTask выполняет 4 шага onPreExecute (), onProgressUpdate (Progress ...) onPostExecute (Result), {выполняется в потоке пользовательского интерфейса}, doInBackground (Params ...) {выполняется в фоновом потоке}. Поскольку он предоставляет 3 метода в потоке пользовательского интерфейса, пользователю не нужно беспокоиться об использовании обработчиков или обратных вызовов для обновления пользовательского интерфейса.
SpunkerBaba

11
@ Pentium10: вместо Service + AsyncTask вы часто можете использовать IntentService
njzk2

11
Также следует отметить, что по умолчанию службы Android работают в основном потоке (UI). Если вашему сервису нужно работать в фоновом режиме, его нужно явно запустить в отдельном потоке (или AsyncTask). В противном случае это может привести к прерыванию реакции пользовательского интерфейса и возникновению ошибок «приложение не отвечает». Сервис с Android - это, по сути, «невидимая» и «миниатюрная» деятельность, а НЕ обязательно «фоновый» работник.
CCJ

23

Это самый простой ответ на ваш вопрос

Нить

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

AsyncTask

это специальный поток, который предоставляет вспомогательные методы для обновления пользовательского интерфейса, поэтому в основном вы можете обновить пользовательский интерфейс, даже если AsyncTask будет работать в фоновом потоке. Обработка межпроцессного взаимодействия не требуется делать явно.

обслуживание

решить вышеуказанную проблему, потому что он работает отдельно от вызывающего его действия, поэтому он может продолжать работать даже после уничтожения действия, он запускается в главном потоке (остерегаясь ANR), используя фоновый сервис (расширяйте IntentService, он автоматически создает рабочий поток для тебя) . Сервис похож на деятельность без UI , хорош для долгой задачи


4
AyncTask не будет воссоздан при повороте устройства, потому что он не синхронизирован с методами жизненного цикла Activity.
CopsOnRoad

4
вы создаете AsyncTask в хуке жизненного цикла Activity, и когда вы поворачиваете телефон, Activity уничтожается и перезапускается. Прежний экземпляр AsyncTask связан с той Активностью, которую вы только что уничтожили, и по этой причине вы получите «Force Close», но вы также увидите, как новый экземпляр AsynTask снова получает триггер. Вы можете использовать фрагменты, чтобы сохранить AsyncTask и установить setRetainInstance (true) для фрагмента, который поможет вам.
Алехандро Серре

15

Немного больше информации, которую я хотел бы, чтобы кто-то сказал мне несколько дней назад:

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

Мой вариант использования выглядит следующим образом: у меня есть один поток в глобальном пространстве, который подключен к серверу, и активность, которая показывает результаты. Когда пользователь нажимает кнопку «Домой», действие переходит в фоновый режим и запускается новая служба. Затем этот сервис считывает результаты из потока и при необходимости отображает информацию в области уведомлений. Я не беспокоюсь о том, что ОС разрушает мою активность, потому что я знаю, что пока служба работает, она не уничтожит поток.


9

Короче говоря, служба для time consuming tasks, AsyncTask для short-lived tasks, резьбы является standard java constructionдля потоков.


3

С точки зрения разработчика:

Поток : используется для выполнения набора кодов параллельно основному потоку. Но вы не можете обрабатывать пользовательский интерфейс внутри потока. Для этого вам нужно использовать Handler. Hadler работает как поток, но может также обрабатывать пользовательский интерфейс.

ASyncTask : Используется для обработки тех задач, которые вы не можете выполнить для работы в главном потоке. Например, HTTP-запрос - это очень тяжелая работа, которую нельзя обработать в основном потоке, поэтому вы обрабатываете HTTP-запрос в разделе ASyncTaskОн работает параллельно с вашим основным потоком в асинхронном режиме в фоновом режиме. У него есть несколько методов обратного вызова, которые вызываются в соответствующих им потоках. События.

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


1
Serviceне обязательно работать в фоновом режиме, если вы не используете IntentService. Если вы запустили стандарт Serviceиз UiThread, он будет работать в UiThread.
Ишахак

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

Да, но это не точно, так как Serviceпо умолчанию не будет запускаться в другом процессе, но в процессе приложения с другими компонентами. Проще сказать, что он Serviceбудет работать на фоне потока, внутри которого он живет.
yshahak

Все вышеперечисленное работает в процессе подачи заявки. Методы preExecute () и postExecute () ASyncTask работают в UIThread, а doInBackground () и onProgress () работают в фоновом потоке. Сервис работает в фоновом потоке, а поток также работает в фоновом потоке. Однако Handler работает в UI Thread.
Рахул Райна

2

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.