Domanda AsyncTask Threading Rule - Può essere usato solo una volta?


Nel documentazione su AsyncTask fornisce di seguito la regola relativa al threading:

  • L'attività può essere eseguita solo una volta (verrà generata un'eccezione se viene tentata una seconda esecuzione).

Tutto ciò significa che devi creare una nuova istanza della classe ogni volta che vuoi usarla, giusto? In altre parole, deve essere fatto in questo modo:

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

Al contrario, NON puoi fare quanto segue:

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

Qualcuno può verificare che questa sia un'interpretazione accurata?

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.


44
2018-04-26 04:39


origine


risposte:


Qualcuno può verificare che questo è un preciso   interpretazione?

Questa è un'interpretazione molto accurata.


98
2018-04-26 11:32



C'è un altro pasticcio con AsyncTasks. Si prega di notare che nell'esempio

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

eseguito su Android 3+ (API livello 11, HONEYCOMB) url1 e url4  non lo farò essere scaricato in parallelo In particolare, se si contatta url1 sta andando a timeout, il trasferimento su url4 non inizierà nemmeno prima che scada. 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 sono stati introdotti per la prima volta, AsyncTasks è stato eseguito in serie su un singolo thread in background. 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 si desidera veramente l'esecuzione parallela, è possibile richiamare executeOnExecutor (java.util.concurrent.Executor, Object []) con  THREAD_POOL_EXECUTOR.


7
2018-03-11 11:32