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.