Różnica między usługą, asynchronicznym zadaniem i wątkiem?


147

Jaka jest różnica między usługą, asynchronicznym zadaniem i wątkiem. Jeśli się nie mylę, wszystkie są używane do robienia pewnych rzeczy w tle. Jak więc zdecydować, którego użyć i kiedy?


Wydaje się, że jest jeszcze jedna rzecz, z którą ludzie często się mylą - ładowarki . Powiązany wątek - Asynctask vs Thread vs Services vs Loader
— RBT

Odpowiedzi:


186

Prawdopodobnie już przeczytałeś opis ich dokumentacji, nie będę ich powtarzał, zamiast tego spróbuję udzielić odpowiedzi własnymi słowami, mam nadzieję, że ci pomogą.

  • Usługa przypomina działanie, ale nie ma interfejsu użytkownika. Prawdopodobnie jeśli chcesz pobrać na przykład pogodę, nie utworzysz dla niej pustego działania, do tego użyjesz Usługi.

  • Wątek to wątek, prawdopodobnie znasz go już z innej części. Musisz wiedzieć, że nie możesz zaktualizować interfejsu użytkownika z wątku. Musisz do tego użyć Handlera, ale czytaj dalej.

  • AsyncTask to inteligentny wątek, którego należy używać. Inteligentny, ponieważ może pomóc w swoich metodach, a istnieją trzy metody, które działają w wątku UI, co jest dobre do aktualizowania składników UI.

Często korzystam z usług, AsyncTasks. Mniej wątków lub wcale, ponieważ mogę zrobić prawie wszystko za pomocą AsyncTask.


1
Dziękuję za wyjaśnienie. Tak więc, jeśli potrzebuję stworzyć aplikację, która pobiera dane z sieci, która byłaby lepszą usługą opcji lub zadaniem asynchronicznym?
— SpunkerBaba,

16
Musisz użyć obu. Tworzysz usługę i używasz AsyncTask.
— Pentium10,

4
Dodaj do powyższej odpowiedzi, AsyncTask przechodzi przez 4 kroki onPreExecute (), onProgressUpdate (Progress ...) onPostExecute (wynik), {działa w wątku interfejsu użytkownika}, doInBackground (Params ...) {działa w wątku w tle}. Ponieważ zapewnia 3 metody w wątku interfejsu użytkownika, użytkownik nie musi martwić się o używanie programów obsługi lub wywołań zwrotnych do aktualizacji interfejsu użytkownika.
— SpunkerBaba

11
@ Pentium10: zamiast Service + AsyncTask, często możesz użyć IntentService
— njzk2

11
Warto również zauważyć, że usługi systemu Android domyślnie działają w wątku głównym (UI). Jeśli Twoja usługa musi działać w tle, należy ją jawnie uruchomić w osobnym wątku (lub AsyncTask). W przeciwnym razie może wystąpić ryzyko przerwania reakcji interfejsu użytkownika i zgłoszenie błędów aplikacji nie odpowiada. Usługa dla Androida jest zasadniczo działaniem „niewidzialnym” i „miniaturowym”, a niekoniecznie pracownikiem „w tle”.
— CCJ,

23

To najłatwiejsza odpowiedź na Twoje pytanie

Wątek

jest jednostką wykonywania, która działa „równolegle” do głównego wątku, jest to ważny punkt, nie możesz zaktualizować składnika interfejsu użytkownika z żadnego wątku tutaj oprócz głównego wątku.

AsyncTask

to specjalny wątek, który zapewnia pomocnicze metody aktualizacji interfejsu użytkownika, więc w zasadzie można zaktualizować interfejs użytkownika, nawet gdy AsyncTask będzie działał w wątku w tle. Obsługa komunikacji międzyprocesowej nie jest wymagana jawnie.

Usługa

rozwiązać powyższy problem, ponieważ jest on oddzielony od działania, które go wywołuje, więc może kontynuować działanie nawet po zniszczeniu działania, działa w głównym wątku (uwaga na ANR) użyj usługi w tle (rozszerz IntentService, aby automatycznie utworzyć wątek roboczy dla Ciebie) . Usługa jest jak działanie bez interfejsu użytkownika , jest dobra do długich zadań


4
AyncTask nie zostanie odtworzony podczas obracania urządzenia, ponieważ nie jest zsynchronizowany z metodami cyklu życia działania.
— CopsOnRoad,

4
tworzysz AsyncTask w haku cyklu życia działania, a po obróceniu telefonu działanie jest niszczone i ponownie uruchamiane. Poprzednie wystąpienie AsyncTask jest połączone z tym działaniem, które właśnie zniszczyłeś iz tego powodu otrzymasz „Wymuś zamknięcie”, ale zobaczysz również, jak nowa instancja AsynTask jest ponownie uruchamiana. Możesz użyć fragmentów, aby zachować AsyncTask i ustawić setRetainInstance (true) na fragmencie, który Ci pomoże.
— Alejandro Serret

15

Kilka dodatkowych informacji, które chciałbym, aby ktoś mi powiedział kilka dni temu:

  • Możesz udostępniać zmienne globalne - takie jak wątki - między działaniami i usługami.
  • Twoja aplikacja wraz ze wszystkimi jej zmiennymi globalnymi nie zostaną wyczyszczone, o ile nadal będzie istnieć Aktywność lub Usługa.
  • Jeśli masz wystąpienie usługi w swojej aplikacji, a system operacyjny potrzebuje zasobów, najpierw zabija Twoje działania, ale dopóki istnieje Usługa, system operacyjny nie wyczyści Twojej aplikacji wraz z jej zmiennymi globalnymi.

Mój przypadek użycia jest taki: mam jeden wątek w globalnej przestrzeni, który jest połączony z serwerem i działanie, które pokazuje wyniki. Gdy użytkownik naciśnie przycisk strony głównej, działanie przechodzi w tło i rozpoczyna się nowa usługa. Ta usługa odczytuje następnie wyniki z wątku i w razie potrzeby wyświetla informacje w obszarze powiadomień. Nie martwię się, że system operacyjny zniszczy moją aktywność, ponieważ wiem, że dopóki Usługa jest uruchomiona, nie spowoduje zniszczenia wątku.


9

W skrócie, Service for time consuming tasks, AsyncTask for short-lived tasks, Thread to usługastandard java construction dla wątków.


3

Z perspektywy dewelopera:

Wątek : Używany do wykonywania zestawu kodów równolegle do głównego wątku. Ale nie możesz obsłużyć interfejsu użytkownika w wątku. W tym celu musisz użyćHandler . Hadler działa jak wątek, ale może również obsługiwać interfejs użytkownika.

ASyncTask : Służy do obsługi tych zadań, których nie można wykonać w głównym wątku. Na przykład żądanie HTTP jest bardzo ciężką pracą, której nie można przenieść na główny wątek, więc możesz obsłużyć żądanie HTTP wASyncTask Działa równolegle z głównym wątkiem asynchronicznie w kilka metod wywołania zwrotnego, które są wywoływane na ich odpowiednich wydarzenia.

Usługa : jest procesem w tle. Jest stosowany, gdy musisz wykonać pewne przetwarzanie, które nie ma powiązanego z nim żadnego interfejsu użytkownika.


1
Servicenie będzie konieczne uruchamianie w tle, chyba że używasz IntentService. Jeśli uruchomiłeś standart Servicez UiThread, będzie on działał na UiThread.
— yshahak

@yshahak Masz rację, ale tutaj nie potrzebujemy głębokiej definicji. Użytkownicy chcą po prostu poznać różnicę między nimi.
— Rahul Raina

Tak, ale to nie jest dokładne, ponieważ Servicedomyślnie nie będzie działać w innym procesie, ale w procesie aplikacji z innymi składnikami. Lepiej powiedzieć, że Servicebędzie działać w tle wątku, w którym żyje.
— yshahak

Wszystkie powyższe trzy działają w ramach procesu aplikacyjnego. Metody preExecute () i postExecute () ASyncTask działają na UIThread i doInBackground (), a onProgress () działa na wątku w tle. Usługa działa w wątku w tle, a wątek działa również w wątku w tle. Jednak Handler działa w wątku interfejsu użytkownika.
— Rahul Raina

2

usługa jest jak zadanie, które zajmuje dużo czasu, ale zadanie Async pozwala nam wykonywać długie operacje w tle i wyświetlać ich wynik w wątku interfejsu użytkownika bez konieczności manipulowania wątkami.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.