web-dev-qa-db-fra.com

exécution d'AsyncTask parallèle

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.

24
sanjeev

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

36
nandeesh

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();
   }
41
S.D.

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
    }
});
4
Arsenius

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);

En savoir plus ici et ici

0
yoAlex5