non è possibile eseguire nuovamente la stessa istanza a meno che l'istanza precedente non abbia completato l'esecuzione. Quindi come mai possono esserci casi di più thread qui?
C'è, ad esempio, il thread principale dell'interfaccia utente e il thread dell'esecutore.
Perché SerialExecutor ha un ArrayDeque? Perché in un momento possiamo avere solo un compito. Se creiamo una nuova istanza di AsyncTask, allora non otterremo una nuova istanza di ArrayDeque, che ha ancora una sola attività da affrontare?
Non è vero che può esserci un solo compito. L'esecutore seriale può eseguire solo un'attività alla volta, ma è possibile accodare più di una attività nel thread principale e vengono eseguite una alla volta nel thread dell'esecutore.
Ci sono altri esecutori oltre all'esecutore seriale, come l'executor del pool di thread che si menziona in seguito.
Lo stesso è il caso di ThreadPoolExecutor. Perché sono necessari i pool di thread quando per una determinata istanza di AsyncTask, possiamo avere solo una Task? Un thread è sufficiente per questo.
La premessa di un solo compito alla volta non è corretta. L'executor del pool di thread è utile per l'esecuzione di più task asincroni contemporaneamente in thread separati.
Come vengono messe in coda le operazioni di coda e le attività multiple? Supponiamo di creare un'istanza di AsyncTask ed eseguirla 5 volte. Quindi se uno è in esecuzione, gli altri 4 non si avviano. SO come posso ottenere più attività in ogni caso?
È possibile eseguire un'istanza di AsyncTask
una sola volta. Ma puoi pubblicare più istanze di AsyncTask
per l'esecuzione.Si noti che tale operazione di registrazione (execute()
e così via) è asincrona e restituisce prima che l'attività asincrona termini e si è in grado di eseguire codice aggiuntivo nel thread dell'interfaccia utente, inclusa la pubblicazione di nuove attività asincrone per l'esecuzione.
Per l'esecuzione parallela, utilizzare solo executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, ...)
.
È anche vero che dal momento che SerialExecutor è statico, quindi verrà utilizzata solo una sua istanza in tutte le istanze AsyncTask e quindi è necessaria una coda?
Sì, c'è un solo esecutore seriale nella tua app ed è condiviso tra tutte le attività asincrone.
Come viene messa in coda la messa in coda di taks e attività multiple? Supponiamo di creare un'istanza di AsyncTask ed eseguirla 5 volte. Quindi se uno è in esecuzione, gli altri 4 non si avviano. SO come posso ottenere più attività in ogni caso? – Diffy
Ok. È anche vero che dal momento che SerialExecutor è statico, quindi verrà utilizzata solo una sua istanza in tutte le istanze AsyncTask e quindi è necessaria una coda? – Diffy