Різниця між службою, завданням асинхронізації та ниткою?


147

У чому різниця між службою, задачею Async & Thread. Якщо я не помиляюся, усі вони використовуються, щоб робити якісь речі у фоновому режимі. Отже, як вирішити, що використовувати і коли?


Здається, є ще одна річ, з якою люди можуть часто плутатись - навантажувачі . Пов’язана тема - Asynctask vs Thread vs Services vs Loader
RBT

Відповіді:


186

Напевно, ви вже прочитали опис документації про них, я їх не повторюватиму, натомість спробую дати відповідь власними словами, сподіваюся, що вони допоможуть вам.

  • Сервіс схожий на Діяльність, але не має інтерфейсу користувача. Можливо, якщо ви хочете, наприклад, взяти погоду, ви не створите для неї порожню активність, для цього ви скористаєтеся Сервісом.

  • Нитка - це нитка, напевно, ви її вже знаєте з іншої частини. Потрібно знати, що ви не можете оновити інтерфейс користувача з теми. Для цього вам потрібно використовувати обробник, але читати далі.

  • AsyncTask - це інтелектуальна нитка, яку рекомендується використовувати. Розумні, як це може допомогти з його методами, є три методи, які працюють на потоці інтерфейсу, що добре оновлювати компоненти інтерфейсу.

Я часто використовую Послуги, AsyncTasks. Нитки менше, або зовсім не такі, оскільки я можу зробити майже все з AsyncTask.


1
Дякуємо за ваше пояснення. Отже, якщо мені потрібно зробити додаток, який отримує дані з Інтернету, що було б кращим варіантом служби або завдання асинхронізації?
SpunkerBaba

16
Вам потрібно використовувати і те, і інше. Ви створюєте Сервіс і всередині якого використовуєте AsyncTask.
Pentium10

4
Додайте до відповіді вище, AsyncTask проходить 4 кроки onPreExecute (), onProgressUpdate (Progress ...) onPostExecute (Результат), {працює в потоці інтерфейсу}, doInBackground (Параметри ...) {працює у фоновому потоці}. Оскільки він пропонує 3 способи в потоці користувальницького інтерфейсу, користувачеві не потрібно турбуватися про використання обробників або зворотних викликів для оновлення інтерфейсу користувача.
SpunkerBaba

11
@ Pentium10: замість Service + AsyncTask часто можна використовувати IntentService
njzk2

11
Також примітно, що сервіси Android за замовчуванням працюють на головному потоці (UI). Якщо вашій службі потрібно виконувати роботу у фоновому режимі, її потрібно запустити в окремому потоці (або AsyncTask). В іншому випадку це може загрожувати перериванням чутливості інтерфейсу та викидати помилки Application Not Response. Служба wrt Android по суті - це "невидима" та "мініатюрна" діяльність, а не обов'язково "фонова" робота.
CCJ

23

Це найпростіша відповідь на ваше запитання

Нитка

це одиниця виконання, яка виконує "паралельно" до головної нитки - важливий момент, ви не можете оновлювати компонент інтерфейсу з жодного потоку тут, крім основного потоку.

AsyncTask

це спеціальна нитка, яка дає вам допоміжні методи для оновлення інтерфейсу користувача, тому в основному ви можете оновити інтерфейс, навіть AsyncTask буде працювати на фоновому потоці. Міжпроцесовий зв'язок не повинен здійснюватися явно.

Сервіс

Вирішіть вищезгадану проблему, оскільки вона живе окремо від активності, яка викликає її, щоб вона могла продовжувати працювати навіть тоді, коли діяльність знищена, вона запускається в головній нитці (остерігайтесь ANR), використовуючи фонову службу (розширіть IntentService, вона автоматично створить робочу нитку для вас) . Сервіс - це як діяльність без інтерфейсу користувача , добре підходить для тривалих завдань


4
AyncTask не буде відтворено при обертанні пристрою, оскільки він не синхронізується з методами життєвого циклу діяльності.
CopsOnRoad

4
ви створюєте AsyncTask у гачку життєвого циклу діяльності, а при повороті телефону активність знищується та перезапускається. Попередній екземпляр AsyncTask пов'язаний з тією діяльністю, яку ви тільки що знищили, і з цієї причини ви отримаєте "Force Close", але ви також побачите, як новий екземпляр AsynTask знову запускає тригер. Ви можете використовувати фрагменти, щоб зберегти AsyncTask і встановити setRetainInstance (true) на фрагменті, який допоможе вам.
Алехандро Серрет

15

Ще небагато інформації, яку я хотів би, щоб хтось сказав мені кілька днів тому:

  • Ви можете ділитися глобальними змінними - такими як потоки - між видами діяльності та службами.
  • Ваша програма разом із усіма її глобальними змінними не буде вилучена, доки активність або Служба все ще є.
  • Якщо у вашому додатку є екземпляр Служби, і ОС потребує ресурсів, вона спочатку вбиває ваші дії, але поки існує служба, ОС не буде видаляти вашу програму разом із її глобальними змінними.

Мій випадок використання виглядає так: у мене є один потік у глобальному просторі, який підключений до сервера, і Діяльність, яка показує результати. Коли користувач натискає кнопку додому, Активність переходить на другий план і починається нова Служба. Потім ця служба зчитує результати з потоку та відображає інформацію в області повідомлень, коли це необхідно. Я не переживаю за те, що ОС знищить мою активність, тому що я знаю, що, поки Служба працює, вона виграє нитку.


9

Коротше кажучи, Сервіс для time consuming tasks, AsyncTask для short-lived tasks, Thread - це standard java constructionдля потоків.


3

З точки зору розробника:

Нитка : використовується для виконання набору кодів паралельно основній темі. Але ви не можете обробити інтерфейс користувача всередині потоку. Для цього вам потрібно скористатися Handler. Адлер працює як нитка, але також може працювати з інтерфейсом користувача.

ASyncTask : використовується для обробки тих завдань, які ви не можете змусити працювати над основною темою. Наприклад, HTTP-запит - це дуже важка робота, яку неможливо обробити в основному потоці, тому ви обробляєте HTTP-запит у розділі ASyncTaskЦе працює паралельно з вашим основним потоком асинхронно у фоновому режимі. У нього є кілька методів зворотного виклику, які викликаються відповідними події.

Сервіс : це фоновий процес. Він використовується, коли ви повинні виконати деяку обробку, яка не має з ним пов'язаного інтерфейсу.


1
Serviceне потрібно працювати у фоновому режимі, якщо ви не використовуєте IntentService. Якщо ви запустили стандарт Serviceз UiThread, він запуститься на UiThread.
yshahak

@yshahak Ви праві, але тут нам не потрібно глибокого визначення. Користувач просто хоче знати різницю між ними.
Рахул Райна

Так, але це не точно, оскільки Serviceне запускається в іншому процесі за замовчуванням, але в додатку з іншими компонентами. Краще сказати, що він Serviceбуде працювати на тлі потоку, що він живе всередині.
йшахак

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

2

сервіс - це завдання, яке займає багато часу, але завдання Async дозволяє нам виконувати довгі / фонові операції та показувати його результат на потоці інтерфейсу користувача, не маніпулюючи потоками.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.