2012-11-19 3 views
9

Sto sviluppando un'applicazione che richiede il download simultaneo di più file. Sto creando un AsyncTask con il suo HttpClient per ogni file, ma il file successivo inizia il download solo dopo aver completato quello precedente.Richiesta HttpClient simultanea utilizzando più AsyncTask

Potrebbe essere un problema lato server?

+0

Potete fornire il codice per l'AsyncTask o il codice che invoca? –

risposta

20

È perché la gestione AsyncTask cambiato in nido d'ape. In precedenza, se avevi avviato i 3 AsyncTasks, questi erano in esecuzione contemporaneamente. Dal momento che HC, se il tuo targetSdk è impostato su o superiore, questi vengono messi in coda ed eseguiti uno per uno (vedere this discussion). Per lavorare che circa iniziare i vostri AsyncTasks in questo modo:

task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, params); 

invece di:

task.execute(params); 

Se il target anche più anziani Androids, è necessario codice condizionale:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { 
    task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, params); 
} else { 
    task.execute(params); 
} 

o avvolgerla in un una classe di supporto separata:

public class Utils { 

    public static <P, T extends AsyncTask<P, ?, ?>> void executeAsyncTask(T task) { 
     executeAsyncTask(task, (P[]) null); 
    } 

    @SuppressLint("NewApi") 
    public static <P, T extends AsyncTask<P, ?, ?>> void executeAsyncTask(T task, P... params) { 
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { 
      task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, params); 
     } else { 
      task.execute(params); 
     } 
    } 
} 

e l'uso sarebbe cioè .:

Utils.executeAsyncTask(new MyAsyncTask()); 
+1

Grazie mille. –

+1

Nota: se stai per inviare richieste HTTP parallele utilizzando Thread pool executor devi guardare qui: Come controllare il Threadpool per le richieste esistenti che vengono inviate altrimenti Rifiuta con RejectedExecutionException http://stackoverflow.com/questions/12074985/java-util-concurrent-rejectedexecutionexception-in-async-task-android – Abs

+0

Great Answer! Molto utile per me! –

1

All'inizio, AsyncTasks veniva 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. Source

Quindi, a seconda della versione AsyncTask non viene eseguita in parallelo. Per le attività come il download di file è necessario utilizzare pool di thread utilizzando Executor

oppure è possibile utilizzare il metodo executeOnExecutor ..