2010-04-26 16 views
44

Nella documentation on AsyncTask dà la seguente regola relativa a filettatura:AsyncTask Threading Rule - Può essere usato solo una volta?

  • L'attività può essere eseguito solo una volta (un'eccezione verrà generata se una seconda esecuzione è tentato.)

Tutto questo significa che si deve creare una nuova istanza della classe ogni volta che si desidera utilizzarlo, giusto? In altre parole, lo si deve fare in questo modo:

new DownloadFilesTask().execute(url1, url2, url3); 
new DownloadFilesTask().execute(url4, url5, url6); 

O al contrario, non è possibile effettuare le seguenti operazioni:

DownloadFilesTask dfTask = new DownloadFilesTask(); 
dfTask.execute(url1, url2, url3); 
dfTask.execute(url4, url5, url6); 

Qualcuno può verificare questo è una corretta interpretazione?

Mi rendo conto che ho praticamente risposto a questo per me stesso mentre stavo scrivendo questo ... Ma non era immediatamente ovvio per me, quindi penso che sarebbe stato utile aver postato comunque.

risposta

97

Qualcuno può verificare che questa sia un'interpretazione esatta di ?

Questa è un'interpretazione molto accurata.

+37

risposta migliore di sempre. – Adam

+3

Leggendo vecchie domande SO e trovo questa risposta estremamente divertente. Ho riso, ed è stato un bel po '. – davidcesarino

7

C'è un altro Gotcha con AsyncTasks. Si noti che nell'esempio

new DownloadFilesTask().execute(url1, url2, url3); 
new DownloadFilesTask().execute(url4, url5, url6); 

eseguito su Android 3+ (API di livello 11, nido d'ape) url1 e url4non verranno scaricati in parallelo. In particolare, se contattando url1 sta per timeout, il trasferimento url4 sarà nemmeno iniziare finché esso è scaduto. A meno che non si specifichi esplicitamente il contrario, tutti i AsyncTasks vengono gestiti dallo stesso thread di lavoro singolo.

I documenti dicono:

ordine di esecuzione

Quando introdotto, AsyncTasks sono state eseguite in serie su un unico filo di fondo. A partire da DONUT, questo è stato modificato in un pool di thread che consente a più attività di operare in parallelo. A partire da HONEYCOMB, le attività vengono eseguite su un singolo thread per evitare errori di applicazione comuni causati dall'esecuzione parallela.

Se veramente si vuole l'esecuzione parallela, è possibile richiamare executeOnExecutor (java.util.concurrent.Executor, Object []) conTHREAD_POOL_EXECUTOR.

+1

Tuttavia, si ricorda che la domanda è su un punto completamente diverso - se un'istanza di AsyncTask può essere riutilizzato. –

Problemi correlati