W niektórych przypadkach można wykonać to samo zadanie za pomocą jednego AsyncTask
lub Service
drugiego, jednak zwykle jedno jest lepiej dostosowane do zadania niż drugie.
AsyncTask
s są przeznaczone do jednorazowych, czasochłonnych zadań, których nie można uruchomić w wątku interfejsu użytkownika. Typowym przykładem jest pobieranie / przetwarzanie danych po naciśnięciu przycisku.
Service
s są zaprojektowane do ciągłego działania w tle. W powyższym przykładzie pobierania danych po naciśnięciu przycisku można uruchomić usługę, pozwolić jej pobrać dane, a następnie ją zatrzymać, ale jest to nieefektywne. O wiele szybciej jest użyć narzędzia AsyncTask
, które uruchomi się raz, zwróci dane i gotowe.
Jeśli jednak musisz ciągle robić coś w tle, Service
najlepszym rozwiązaniem jest. Przykłady obejmują odtwarzanie muzyki, ciągłe sprawdzanie nowych danych itp.
Ponadto, jak już powiedział Sherif, usługi niekoniecznie są uruchamiane z wątku interfejsu użytkownika.
W większości przypadków Service
są one przeznaczone do uruchamiania kodu, nawet jeśli aplikacja Activity
nie jest otwarta. AsyncTask
s są zaprojektowane tak, aby wykonywanie kodu poza wątkiem interfejsu użytkownika było niezwykle proste.
Usługi są zupełnie inne: Usługi to nie wątki !
Twoje działanie wiąże się z usługą, a usługa zawiera pewne funkcje, które po wywołaniu blokują wątek wywołujący. Twoja usługa może służyć do zmiany temperatury z Celsjusza na stopnie. Dowolna powiązana aktywność może uzyskać tę usługę.
Jednak
AsyncTask
jest to wątek, który wykonuje pewną pracę w tle i jednocześnie ma możliwość raportowania wyników z powrotem do wątku wywołującego.Tylko myśl: usługa może mieć
AsyncTask
przedmiot!źródło
Service
jest jednym z elementów frameworka Androida, który nie wymaga UI do wykonania, co oznacza, że nawet gdy aplikacja nie jest aktywnie używana przez użytkownika, możesz wykonać jakąś operację z usługą. Nie oznacza to, że usługa będzie działać w osobnym wątku, ale działa w wątku głównym i operację można w razie potrzeby wykonać w osobnym wątku. Przykłady zastosowań to odtwarzanie muzyki w tle, synchronizowanie danych z serwerem w tle bez interakcji użytkownika itpAsyncTask
z drugiej strony jest używany do zadań blokowania interfejsu użytkownika, które mają być wykonywane w osobnym wątku. To tak samo, jak tworzenie nowego wątku i wykonywanie zadania, gdy wszystkie zadania związane z tworzeniem i utrzymywaniem wątków oraz wysyłaniem wyników do głównego wątku są obsługiwane przez AsyncTask Przykład użycia to pobieranie danych z serwera, operacje CRUD na resolwerze treści itp.źródło
Service i asynctasks robią prawie to samo, prawie .using service lub asynctask zależy od twoich wymagań.
na przykład, jeśli chcesz załadować dane do widoku listy z serwera po naciśnięciu jakiegoś przycisku lub zmianie ekranu, lepiej idź z asynctask.it działa równolegle z głównym wątkiem interfejsu użytkownika (działa w tle). do uruchomienia aktywności asynctack lub twoja aplikacja powinna w głównym wątku interfejsu użytkownika. po wyjściu z aplikacji nie ma asynctask.
Ale usługi nie są takie, po uruchomieniu usługi może ona działać po wyjściu z aplikacji, chyba że zatrzymasz usługę. Tak jak powiedziałem, zależy to od twoich wymagań. Jeśli chcesz nadal sprawdzać odbieranie danych lub sprawdzać stan sieci ciągle lepiej idź z obsługą.
szczęśliwego kodowania.
źródło
W kilku przypadkach możesz osiągnąć tę samą funkcjonalność, używając obu. W przeciwieństwie do zadania asynchronicznego usługa ma własny cykl życia i dziedziczy kontekst (usługa jest bardziej niezawodna niż zadanie asynchroniczne). Usługa może działać nawet po zamknięciu aplikacji. Jeśli chcesz coś zrobić nawet po zamknięciu aplikacji, a także potrzebujesz zmiennej kontekstowej, przejdziesz do usługi.
Przykład: Jeśli chcesz odtwarzać muzykę i nie chcesz wstrzymywać, jeśli użytkownik opuści aplikację, na pewno wybierzesz usługę.
źródło
Porównanie lokalnej usługi klasy bazowej w toku z
AsyncTask
:✱ (Ta odpowiedź nie dotyczy usług eksportowanych ani żadnej usługi działającej w procesie innym niż proces klienta, ponieważ oczekiwane przypadki użycia różnią się znacznie od przypadków użycia
AsyncTask
. Ponadto, w interesie zwięzłości, charakter pewnych wyspecjalizowanychService
podklasy (npIntentService
,JobService
) będą ignorowane tutaj).Żywotność procesu
A
Service
reprezentuje dla systemu operacyjnego „chęć aplikacji do wykonywania dłuższej operacji bez interakcji z użytkownikiem” [ ref ].Kiedy masz
Service
uruchomiony, Android rozumie, że nie chcesz, aby Twój proces został zabity. Dotyczy to również sytuacji, gdy maszActivity
ekran, a jest to szczególnie prawdziwe, gdy używasz usługi pierwszego planu . (Kiedy wszystkie składniki aplikacji znikną, system Android myśli: „Och, teraz jest dobry czas, aby zabić tę aplikację, abym mógł zwolnić zasoby”).Ponadto, w zależności od ostatniej zwróconej wartości z
Service.onCreate()
, Android może próbować „ożywić” aplikacje / usługi, które zostały zabite z powodu presji zasobów [ ref ].AsyncTasks
nie rób tego. Nie ma znaczenia, ile wątków w tle masz uruchomionych ani jak ciężko pracują: Android nie utrzyma twojej aplikacji przy życiu tylko dlatego, że aplikacja korzysta z procesora. Musi mieć jakiś sposób, aby wiedzieć, że Twoja aplikacja nadal ma pracę; dlategoServices
są zarejestrowane w systemie operacyjnym, aAsyncTasks
nie.Wielowątkowość
AsyncTasks
polegają na utworzeniu wątku w tle, na którym można wykonać pracę, a następnie zaprezentowaniu wyniku tej pracy wątkowi interfejsu użytkownika w sposób bezpieczny dla wątków.Każde nowe
AsyncTask
wykonanie generalnie skutkuje większą współbieżnością (większą liczbą wątków), z zastrzeżeniem ograniczeńAsyncTasks's
puli wątków [ ref ].Service
Z drugiej strony metody są zawsze wywoływane w wątku interfejsu użytkownika [ ref ]. Odnosi się to doonCreate()
,onStartCommand()
,onDestroy()
,onServiceConnected()
, itd. Tak więc, w pewnym sensie,Services
nie zrobić „run” w tle. Po uruchomieniu (onCreate()
) po prostu „siedzą” tam - aż nadejdzie czas na wyczyszczenie, wykonanieonStartCommand()
itp.Innymi słowy, dodanie kolejnych
Services
nie powoduje większej współbieżności. Metody serwisowe nie są dobrym miejscem do wykonywania dużej ilości pracy, ponieważ działają w wątku interfejsu użytkownika .Oczywiście możesz je rozszerzać
Service
, dodawać własne metody i wywoływać je z dowolnego wątku. Ale jeśli to zrobisz, odpowiedzialność za bezpieczeństwo nici spoczywa na tobie - a nie na strukturze.Jeśli chcesz dodać wątek w tle (lub innego rodzaju pracownika) do swojego
Service
, możesz to zrobić. Możesz na przykład rozpocząć wątek /AsyncTask
in w tleService.onCreate()
. Ale nie wszystkie przypadki użycia tego wymagają. Na przykład:Service
działać, aby nadal otrzymywać aktualizacje lokalizacji w „tle” (co oznacza, że niekoniecznie musiszActivities
wyświetlać na ekranie).BroadcastReceiver
przez dłuższy czas rejestrować „niejawną” (po API 26 nie zawsze możesz to zrobić za pomocą manifestu, więc zamiast tego musisz zarejestrować się w czasie wykonywania [ ref ]).Żaden z tych przypadków użycia nie wymaga dużej aktywności procesora; wymagają tylko, aby aplikacja nie została zabita .
Jako pracownicy
Services
nie są zorientowane na zadania. Nie są skonfigurowane do „wykonywania zadania” i „dostarczania wyniku”, jakAsyncTasks
są.Services
nie rozwiązują żadnych problemów związanych z bezpieczeństwem wątków (niezależnie od faktu, że wszystkie metody są wykonywane w jednym wątku).AsyncTasks
z drugiej strony zajmij się tą złożonością za siebie.Zauważ, że
AsyncTask
jest to przestarzałe . Ale to nie oznacza, że należy wymienićAsyncTasks
zServices
! (Jeśli dowiedziałeś się czegoś z tej odpowiedzi, to powinno być jasne).TL; DR
Services
są głównie po to, by „istnieć”. Działają jak poza ekranemActivity
, dając powód, dla którego aplikacja pozostaje żywa, podczas gdy inne komponenty zajmują się „pracą”.AsyncTasks
wykonują „pracę”, ale same w sobie nie utrzymają procesu przy życiu.źródło