11

Ho bisogno di eseguire un numero di AsyncTask s e quindi raccogliere tutti i loro risultati, consolidare e quindi restituire il risultato finale al mio utente.Come utilizzare ExecutorService con Android AsyncTask?

Sto cercando un modo per gestire più AsyncTask s in Android. Sto pensando di usare un ExecutorService dal pacchetto Java Concurrency ma mi sono bloccato perché lo standard ExecutorService prende SOLO i Runnables o i Callables. Per stabilire la mia esigenza posso usare il

ExecutorService.invokeAll((Collection<? extends Callable<T>> tasks)

Il metodo invokeAll() restituirà un elenco di List<Future><V>> solo quando tutte le attività presentate sono completate e posso ottenere i miei risultati per ogni attività dal suo corrispondente Future.

Tutto va bene con ExecutorService l'attesa per il fatto che non accetta AsyncTask.

C'è un altro modo di utilizzare AsyncTask e ExecutorService o se è possibile, per favore, consigliare un approccio diverso.

+1

La cosa buona è [AsyncTask] (http://developer.android.com/reference/android/os/AsyncTask.html) ha metodo executeOnExecutor(), la cosa brutta è che è disponibile solo dal livello API 11 – yorkw

+0

Qualsiasi riferimento su come usare executeOnExecutor? Inoltre questa funzione è disponibile da HoneyComb (API Livello 11) ma il mio minSDK della mia app è 4. – AKh

+1

Se insisti, dai un'occhiata alla mia risposta [qui] (http://stackoverflow.com/questions/7211684/asynctask-executeonexecutor-before- api-level-11/9509184 # 9509184). – yorkw

risposta

1

Creare un AsyncTask e avviare le discussioni da doInBackground(). Quando hanno finito, raccolgono, consolidano, ecc. I dati e li restituiscono. Quindi è possibile utilizzarlo in onPostExecute per aggiornare l'interfaccia utente. L'avvio di troppi thread consumerà memoria, quindi è necessario valutare se è necessario eseguirli in parallelo.

+0

AsyncTask stesso ha un pool di thread al suo interno. Possiamo usare questo pool per eseguire più attività invece di crearne un altro? – AKh

+1

Non direttamente. Per quanto riguarda 'executeOnExecutor()', lo scopo di questo metodo è di rendere possibile l'esecuzione simultanea di più 'AsyncTask', dal momento che quello interno può eseguire solo un' AsyncTask' alla volta (Honeycomb e versioni successive). Ciò significa che se inizi due 'AsyncTask' più o meno allo stesso tempo, il secondo attenderà che il primo finisca prima che inizi. Se hai bisogno di fare qualcosa di più complicato, non devi usare un 'AsyncTask', solo il tuo codice di threading come al solito e usare un Handler per notificare all'interfaccia utente quando ottieni i risultati. –

+0

Non è VERO che "Ciò significa che se si avviano due AsyncTasks più o meno allo stesso tempo, il secondo attenderà che il primo finisca prima che inizi" – Zou