J'ai une SplashActivity dans mon application qui fait des choses en utilisant AsyncTask lorsque je démarre mon application.
J'ai également créé une autre AsyncTask qui télécharge les données du serveur. Maintenant, après avoir fermé mon application, AsyncTask télécharge toujours les données.
Mais lorsque je redémarre mon application, mon AsyncTask de SplashActivity n'exécute pas son arrière-plan (fonction doInBackground) jusqu'à ce que mon téléchargeur AsyncTask soit terminé et que mon application soit bloquée.
Ma question est donc que nous ne pouvons pas exécuter deux AsyncTask parallèles? Les deux AsyncTask sont différentes et font leurs propres trucs. Y a-t-il un moyen de le faire.
Vous devrez utiliser un thread pool Executor
pour exécuter AsyncTask
. L'implémentation par défaut utilise un exécuteur série exécuté sur un seul thread
Créez donc un ThreadPoolExecutor puis utilisez
AsyncTask's executeOnExecutor au lieu de simplement exécuter la méthode
Il y a eu un changement dans AsyncTask depuis la version Honeycomb. Les versions antérieures avaient un pool de threads de 10 threads, vous pouvez donc exécuter 10 tâches en parallèle. Mais pour Honeycomb et plus, par défaut est un exécuteur en série, qui exécute les tâches une par une. Mais vous pouvez passer un ThreadPoolExecutor
pour l'exécution:
if (Build.VERSION.SDK_INT >= 11) {
//--post GB use serial executor by default --
task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
} else {
//--GB uses ThreadPoolExecutor by default--
task.execute();
}
Une autre option utilise AsyncTaskCompat de la bibliothèque de support v.4.
AsyncTaskCompat.executeParallel(new AsyncTask<Void, Void, Object>() {
@Override
protected Object doInBackground(Void... params) {
// do your parallel task here
return null;
}
@Override
protected void onPostExecute(Object result) {
// and fetch result
}
});
AsyncTask
est conçu comme une classe d'assistance autour de ThreadPoolExecutor
qui supprime la nécessité pour un utilisateur d'être exposé directement aux threads et aux opérations.
Mises en garde : AsyncTask
doit être utilisé pour exécuter des opérations courtes (quelques secondes au maximum) dans un ordre séquentiel.
Android 9 (API niveau 28)
Séquentiellement - SERIAL_EXECUTOR
new MyAsyncTask().execute();
Simultanément - THREAD_POOL_EXECUTOR
new MyAsyncTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);