2012-03-07 11 views
6

Questo dovrebbe avere una risposta facile, ma non ho potuto trovare nessuno. E visto che sono ancora un maniaco di Android sono venuto qui per chiederti alla gente.Esiste un limite di AsyncTasks per essere eseguito nello stesso momento?

Ho realizzato questo progetto che esegue 10 AsyncTasks all'avvio. Ogni attività contiene 3 URL che raccolgono dati e non fanno nulla di importante nell'app (ancora).

Ho anche 10 visualizzazioni di testo che uso per tenere traccia dello stato di avanzamento dei AsyncTasks.

Quando un'attività avvia il TextView appropriata è messo su "Start" Quando un'attività sta procedendo imposta la sua TextView opportuno "Download" Quando un'attività è finito imposta la sua TextView opportuno "Finito"

Questo è quello che ho osservato e sono venuto a domande su AsyncTask. Quando avvio l'app, noto che 5 delle visualizzazioni di testo sono passate al marker "Download", quindi vedo 5 AsyncTask che fanno il loro lavoro come dovrebbero. Al termine, avvia un nuovo AsyncTask. Tuttavia non raggiungono mai il limite di 5.

Che cosa causa questo limite di 5 AsynchTasks in esecuzione allo stesso tempo? Ho causato questo in qualche file che non riesco a trovare? È un limite di Android 2.3.3? Forse un limite del dispositivo che sto utilizzando per sim l'app?

Qualcuno può elaborare per me?

+0

Questa domanda è indirizzata qui: http://stackoverflow.com/questions/3077461/asynctask-threads-never-die-android – jengelsma

+0

@jengelsma Non proprio. È sicuramente correlato, ma il motivo per cui non va oltre il 5 è in qualche modo diverso dal perché non va mai sotto 5. Ha ancora a che fare con le dimensioni del pool principale, ma quella domanda/risposta non affronta il motivo per cui le dimensioni del core pool limiterebbero il numero di attività concorrenti a 5 quando la dimensione massima del pool è 128. – kabuko

+0

Penso che tu stia utilizzando AsyncTask.execute() invece di AsyncTask.executeOnExecutor() –

risposta

8

Sì, c'è un limite. AsyncTask è supportato da un ThreadPoolExecutor con una dimensione del pool principale di 5, ma una dimensione massima del pool di 128 (da 1.6 a 4.0.3), quindi penso davvero che dovresti vedere tutti e 10 i tuoi correre contemporaneamente. Non puoi cambiarlo però. Se vuoi veramente fare qualcosa di diverso (e non lo consiglierei a meno che tu non abbia una ragione molto specifica), dovrai fare qualcosa di personalizzato con una dimensione di piscina più grande o semplicemente far girare un mucchio di fili manualmente.

Aggiornamento:

Ecco cosa i documenti dicono:

Se ci sono più di corePoolSize ma meno di discussioni maximumPoolSize esecuzione, un nuovo thread viene creato solo se la coda è piena.

Ecco perché. La tua coda non è piena, quindi si limita a mantenere le dimensioni del pool principale.

+0

Ecco un link all'origine di [AsyncTask] (http: // grepcode .com/file/repository.grepcode.com/java/ext/com.google.android/android/1.6_r2/android/os/AsyncTask.java # AsyncTask) come riferimento. – kabuko

+2

È possibile fornire un'istanza arbitraria di 'Executor' a' executeOnExecutor() 'se si desidera personalizzare la modalità di gestione di' AsyncTask's. – Argyle

+1

@Argyle buon punto; questa è una buona opzione per API 11 e versioni successive. – kabuko

0

ThreadPoolExecutor ha un corePoolSize, un maxPoolSize e un QueueCapacity. Se vengono utilizzati tutti i thread da corePoolSize, qualsiasi altra attività viene inserita nella coda di ciascuno dei thread dal pool principale. Dopo che queste code sono piene, viene inizializzato un nuovo thread, purché entro i limiti di maxPoolSize.

Il problema qui è che le code di ogni thread (a meno che non vengano modificate in modo programmatico) sono UNBOUNDED. Ciò significa che tutti i thread della dimensione del pool principale vengono utilizzati e qualsiasi altra attività viene accodata e attende il proprio turno con uno dei thread principali. Non hanno mai la possibilità di raggiungere la dimensione massima della piscina.

È necessario configurare il proprio Executor e modificare la capacità della coda. In bocca al lupo!