Asynctask vs Thread in Android


135

Nell'interfaccia utente, per eseguire alcuni lavori in background, ne ho usato uno separato Thread. Ma come suggerito da altri, ora sto usando AsyncTask.

Qual è la differenza principale tra a Threade an AsyncTask?

In quale scenario, dovrei usare a Threado an AsyncTask?



@ webaldo.at L'ho ripetuto, qui hanno fornito la descrizione e la differenza tra Asynctask e Thread. Voglio sapere quale caso, ad esempio connessione di rete, file letto per quello che uso?
Ram,

Abbreviato: Thread -> Nessun accesso all'interfaccia utente || Asynctask -> Accesso condizionale all'interfaccia utente
JavaDM,

per l'attività in background IntentService è un'altra bella opzione.
Chen,

Risposte:


146

Per attività di lunga durata o con un uso intensivo della CPU, esistono sostanzialmente due modi per farlo: thread Java e AsyncTask nativo di Android.

Nessuno dei due è necessariamente migliore dell'altro, ma sapere quando utilizzare ogni chiamata è essenziale per sfruttare le prestazioni del sistema a proprio vantaggio.

Usa AsyncTask per:

  1. Semplici operazioni di rete che non richiedono il download di molti dati
  2. Attività associate al disco che potrebbero richiedere più di qualche millisecondo

Usa thread Java per:

  1. Operazioni di rete che comportano quantità moderate o elevate di dati (upload o download)
  2. Attività ad alta CPU che devono essere eseguite in background
  3. Qualsiasi attività in cui si desidera controllare l'utilizzo della CPU relativamente al thread della GUI

E ci sono molte buone risorse su Internet che possono aiutarti:

http://www.vogella.com/articles/AndroidBackgroundProcessing/article.html


Posso chiederti perché l'importo dei dati di download è un problema?
Yeung

1
@Yeung Sembra che tu abbia bisogno di informazioni su Async Task! Guarda, maggiore è la quantità di dati, quindi chiaramente maggiore è il tempo impiegato per completare la stessa operazione. Pertanto, non è una buona pratica eseguire processi di lunga durata utilizzando l'attività asincrona per i seguenti motivi: 1. L'attività asincrona è scarsamente legata al ciclo di vita delle attività. 2. Creano perdite di memoria.
Mohit,

3
Dai un'occhiata a questo: stackoverflow.com/questions/12797550/…
Mohit

Grazie. Adesso capisco il rischio.
Yeung

@Impasse @Yeung La quantità di dati IMO non è un problema, il problema chiave con le operazioni di rete è al momento dell'operazione. Anche il download di pochi byte può richiedere molto tempo, quando il server è occupato, irraggiungibile (timeout) ecc. Una soluzione potrebbe essere quella di utilizzare il AsyncTaskproprio programmatore.
xmedeko,

44

Se usi i thread Java devi gestire i seguenti requisiti nel tuo codice:

Sincronizzazione con il thread principale se si postano risultati nell'interfaccia utente

Nessun valore predefinito per l'annullamento del thread

Nessun pool di thread predefinito

Nessun valore predefinito per la gestione delle modifiche alla configurazione in Android


3
questo è in realtà più chiaro perché affronta i motivi per cui non usare semplici thread. Dall'inizio della mia mente, tutto ciò che deve essere legato al ciclo di vita di attività / servizio dovrebbe invece utilizzare AsyncTask, anche se è necessario "degradare con grazia" manualmente le risorse all'interno dell'attività, almeno non si finisce con l'impiccagione dell'attività quando l'attività viene uccisa.
leRobot,

28

Filo

  • Compito lungo in generale
  • Richiamare con il metodo thread.start ()
  • Attivato da qualsiasi thread
  • Funziona sul proprio thread
  • La gestione / codice manuale del thread potrebbe risultare difficile da leggere

AsyncTask

  • Piccolo compito dover comunicare con il thread principale
  • Richiamare con il metodo excute ()
  • Attivato dal thread principale
  • Funziona su thread di lavoro
  • Deve essere eseguito e creato dal thread principale

11

Filo

Un thread è un'unità di esecuzione simultanea. Ha il proprio stack di chiamate. Esistono due metodi per implementare i thread nelle applicazioni.

Uno sta fornendo una nuova classe che estende Thread e sovrascrive il suo metodo run (). L'altro sta fornendo a una nuova istanza Thread un oggetto Runnable durante la sua creazione. Un thread può essere eseguito chiamando il suo metodo "start". Puoi impostare la "Priorità" di un thread chiamando il suo metodo "setPriority (int)".

È possibile utilizzare un thread se non si ha alcun effetto nella parte dell'interfaccia utente. Ad esempio, si sta chiamando un servizio Web o si scaricano alcuni dati e, dopo il download, lo si visualizza sullo schermo. Quindi devi usare un gestore con un thread e questo renderà la tua applicazione complicata per gestire tutte le risposte dai thread.

Un gestore consente di inviare ed elaborare oggetti Message e Runnable associati a MessageQueue di un thread. Ogni thread ha ciascuna coda di messaggi. (Come un elenco di cose da fare) e il thread prenderà ogni messaggio e lo elaborerà fino a quando la coda dei messaggi è vuota. Pertanto, quando l'handler comunica, invia un messaggio al thread del chiamante e attenderà l'elaborazione.

Se si utilizzano thread Java, è necessario gestire i seguenti requisiti nel proprio codice:

Sincronizzazione con il thread principale se si riportano risultati all'interfaccia utente Nessun valore predefinito per l'annullamento del thread Nessun pool di thread predefinito Nessun valore predefinito per la gestione delle modifiche alla configurazione in Android

AsyncTask

AsyncTask consente un uso corretto e semplice del thread dell'interfaccia utente. Questa classe consente di eseguire operazioni in background e pubblicare risultati sul thread dell'interfaccia utente senza dover manipolare thread e / o gestori. Un'attività asincrona è definita da un calcolo che viene eseguito su un thread in background e il cui risultato è pubblicato sul thread dell'interfaccia utente.

AsyncTask passerà attraverso le seguenti 4 fasi:

OnPreExecute ()

Richiamato sul thread dell'interfaccia utente prima dell'esecuzione dell'attività

doInbackground (Parametri ..)

Richiamato sul thread in background immediatamente dopo che onPreExecute () termina l'esecuzione.

onProgressUpdate (Progress ..)

Richiamato sul thread dell'interfaccia utente dopo una chiamata a publishingProgress (Progress ...).

OnPostExecute (Risultato)

Richiamato sul thread dell'interfaccia utente al termine del calcolo in background.

Perché dovresti usare AsyncTask?

Facile da usare per un thread dell'interfaccia utente. (Quindi, usalo quando il thread del chiamante è un thread dell'interfaccia utente).

Non è necessario manipolare i gestori.

Per ulteriori informazioni visita qui


2

Filo:

Threaddovrebbe essere usato per separare le operazioni di lunga durata dal thread principale in modo da migliorare le prestazioni. Ma non può essere cancellato in modo elegante e non può gestire le modifiche alla configurazione di Android. Non è possibile aggiornare l'interfaccia utente da Thread.

AsyncTaskpuò essere utilizzato per gestire oggetti di lavoro di durata inferiore a 5 ms. Con AsyncTask, è possibile aggiornare l'interfaccia utente a differenza di Java Thread. Ma molte attività di lunga durata soffocano le prestazioni.

Hai qualche alternativa in più per entrambi.

HandlerThread / Handler e ThreadPoolExecutor

Fare riferimento al post seguente per maggiori dettagli:

Handler vs AsyncTask vs 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.