Differenza tra servizio, attività asincrona e thread?


Risposte:


186

Probabilmente hai già letto la descrizione della documentazione su di loro, non li ripeterò, invece cercherò di dare una risposta con le mie parole, spero che ti aiuteranno.

  • Il servizio è come un'attività ma non ha un'interfaccia utente. Probabilmente se vuoi recuperare il tempo, ad esempio, non creerai un'attività vuota per questo, per questo utilizzerai un Servizio.

  • Un thread è un thread, probabilmente lo sai già da un'altra parte. Devi sapere che non puoi aggiornare l'interfaccia utente da un thread. È necessario utilizzare un gestore per questo, ma leggere più avanti.

  • Un AsyncTask è un thread intelligente che si consiglia di utilizzare. Intelligente in quanto può aiutare con i suoi metodi, e ci sono tre metodi che vengono eseguiti sul thread dell'interfaccia utente, il che è utile per aggiornare i componenti dell'interfaccia utente.

Sto usando i servizi, AsyncTasks frequentemente. Discussione di meno o per niente, poiché posso fare quasi tutto con AsyncTask.


1
Grazie per la tua spiegazione. Quindi, se devo creare un'applicazione che recupera i dati dal Web, quale sarebbe un servizio di opzioni migliore o un'attività asincrona?
SpunkerBaba,

16
Devi usare entrambi. Si crea un servizio e al suo interno si utilizza AsyncTask.
Pentium10

4
Aggiungi alla risposta sopra, AsyncTask esegue 4 passaggi onPreExecute (), onProgressUpdate (Progress ...) onPostExecute (Risultato), {in esecuzione in UI thread}, doInBackground (Params ...) {in esecuzione in thread in background}. Poiché fornisce 3 metodi nel thread dell'interfaccia utente, l'utente non deve preoccuparsi di utilizzare gestori o callback per aggiornare l'interfaccia utente.
SpunkerBaba,

11
@ Pentium10: invece di Service + AsyncTask, spesso puoi usare un IntentService
njzk2

11
È anche degno di nota il fatto che, per impostazione predefinita, i servizi Android vengono eseguiti sul thread principale (UI). Se il tuo servizio deve funzionare in background, deve essere avviato in modo esplicito in un thread separato (o AsyncTask). Altrimenti può rischiare di interrompere la reattività dell'interfaccia utente e generare errori di mancata risposta dell'applicazione. Un servizio su Android è essenzialmente un'attività "invisibile" e "in miniatura", NON necessariamente un lavoratore "in background".
CCJ

23

Questa è la risposta più semplice per la tua domanda

Filo

è un'unità di esecuzione che esegue "parallelo" al thread principale è un punto importante, non è possibile aggiornare un componente dell'interfaccia utente da qualsiasi thread qui tranne il thread principale.

AsyncTask

è un thread speciale, che ti offre metodi di supporto per aggiornare l'interfaccia utente, quindi in pratica puoi aggiornare l'interfaccia utente anche se AsyncTask verrà eseguito su un thread in background. La gestione delle comunicazioni tra processi non deve essere eseguita in modo esplicito.

Servizio

risolvere il problema sopra perché vive separato dall'attività che lo richiama in modo che possa continuare a funzionare anche quando l'attività viene distrutta, viene eseguita nel thread principale (attenzione a ANR) utilizza un servizio in background (estendi IntentService crea automaticamente il thread di lavoro per te) . Il servizio è come un'attività senza interfaccia utente , è utile per attività lunghe


4
AyncTask non verrebbe ricreato ruotando il dispositivo perché non è sincronizzato con i metodi del ciclo di vita dell'Attività.
CopsOnRoad,

4
si crea l'AsyncTask in un hook del ciclo di vita di Activity e quando si ruota il telefono, l'attività viene distrutta e riavviata. L'istanza precedente dell'AsyncTask è connessa a quell'Attività che hai appena distrutto e per questo motivo otterrai una "Chiusura forzata" ma vedrai anche come una nuova istanza dell'AsynTask si riaccende. Puoi usare Frammenti per conservare AsyncTask e impostare setRetainInstance (true) sul Frammento che ti aiuterà.
Alejandro Serret,

15

Poche altre informazioni vorrei che qualcuno mi avesse detto qualche giorno fa:

  • È possibile condividere variabili globali - come i thread - tra Attività e Servizi.
  • L' applicazione insieme a tutte le sue variabili globali non verrà cancellata fintanto che è presente un'attività o un servizio.
  • Se hai un'istanza di un servizio nella tua app e il sistema operativo ha bisogno di risorse, prima uccide le tue attività, ma finché c'è il servizio, il sistema operativo non cancellerà la tua applicazione insieme alle sue variabili globali.

Il mio caso d'uso è il seguente: ho un thread nello spazio globale collegato a un server e un'attività che mostra i risultati. Quando l'utente preme il pulsante Home, l'attività passa in background e viene avviato un nuovo servizio. Questo servizio quindi legge i risultati dal thread e visualizza le informazioni nell'area di notifica quando necessario. Non mi preoccupo che il sistema operativo distrugga la mia attività perché so che finché il servizio è in esecuzione non distruggerebbe il thread.


9

In breve, Service for time consuming tasks, AsyncTask for short-lived tasks, Thread è un standard java constructionthread.


3

Dal punto di vista dello sviluppatore:

Thread : utilizzato per eseguire il set di codici in parallelo al thread principale. Ma non puoi gestire l'interfaccia utente all'interno del thread. Per questo è necessario utilizzare Handler. Hadler funziona come thread ma può anche gestire l'interfaccia utente.

ASyncTask : utilizzato per gestire quelle attività che non è possibile far funzionare sul thread principale. Ad esempio, una richiesta HTTP è un lavoro molto pesante che non può essere gestito sul thread principale, quindi gestisci la richiesta HTTP in ASyncTaskFunziona in parallelo con il thread principale in modo asincrono in background. Ha pochi metodi di callback che sono invocati sul loro corrispondente eventi.

Servizio : è un processo in background. Viene utilizzato quando è necessario eseguire alcune elaborazioni a cui non è associata alcuna interfaccia utente.


1
Servicenon sarà necessario eseguire in background a meno che non lo si usi IntentService. Se hai avviato uno standart Serviceda UiThread, verrà eseguito su UiThread.
yshahak, il

@yshahak Hai ragione, ma qui non abbiamo bisogno di una definizione approfondita. L'utente vuole solo sapere la differenza tra di loro.
Rahul Raina,

Sì, ma questo non è accurato, poiché Servicenon verrà eseguito in un processo diverso per impostazione predefinita, ma nel processo dell'app con gli altri componenti. Meglio dire che Serviceverrà eseguito sullo sfondo del thread all'interno del quale vive.
yshahak,

Tutti e tre i lavori sopra menzionati nel processo di candidatura. I metodi preExecute () e postExecute () di ASyncTask funzionano su UIThread e doInBackground () e onProgress () funzionano sul thread in background. Il servizio funziona sul thread in background e Thread funziona anche sul thread in background. Tuttavia Handler funziona su UI Thread.
Rahul Raina,

2

il servizio è come un'attività che richiede molto tempo ma l'attività asincrona ci consente di eseguire operazioni lunghe / in background e mostrare i suoi risultati sul thread dell'interfaccia utente senza dover manipolare i thread.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.