web-dev-qa-db-fra.com

AsyncTask execute () ou executeOnExecutor ()?

Quelle est la différence entre execute() et executeOnExecuter()?

  • Comment execute() exécute-t-il les tâches par défaut? (en série ou en parallèle?)

  • Que faut-il utiliser pour les nouveaux SDK> 16?

  • Est-ce une bonne pratique d’utiliser l’exécution parallèle (THREAD_POOL_EXECUTOR) pour les tâches plutôt que les tâches en série même si cela n’a aucune importance pour l’application ou est-ce que cela dépend du nombre de AsyncTasks qui seront exécutés?

47
rashad.z

Comment .execute exécute les tâches par défaut (en série ou en parallèle).

Avant le niveau 11 de l’API: parallèle.

API de niveau 11 et supérieur: série.

lequel doit être utilisé pour les nouveaux SDK> 16 (executeOnExecuter?)

Dépend de vos besoins. Utilisez execute() si vous êtes satisfait de l'exécuteur par défaut. Utilisez un exécuteur explicite si vous ne l'êtes pas.

Est-ce une bonne pratique d'utiliser une exécution parallèle (THREAD_POOL_EXECUTOR) pour les tâches plutôt que de série, même si cela n'a pas d'importance pour l'application ou cela dépend-il du nombre de tâches asynchrones qui seront exécutées?

Les tâches asynchrones ne doivent être utilisées que pour des opérations relatives à un arrière-plan relativement court. Citant la documentation AsyncTask:

AsyncTasks devrait idéalement être utilisé pour des opérations courtes (quelques secondes au maximum). Si vous devez maintenir les threads en cours d'exécution pendant de longues périodes, il est vivement recommandé d'utiliser les différentes API fournies par le package Java.util.concurrent, telles que Executor, ThreadPoolExecutor et FutureTask.

Pendant l'exécution de la tâche asynchrone, le thread exécuteur ne peut pas exécuter d'autres tâches. Sur un exécuteur en série avec un seul thread exécuteur, il est plus facile de détecter les problèmes lorsque vos tâches sont exécutées trop longtemps. Sur un exécuteur parallèle, la détection de tels problèmes prend plus de tâches simultanées de longue durée.

Par conséquent, si vous avez vraiment besoin de passer à un exécuteur parallèle, il est probablement préférable de revoir votre conception.

46
laalto

. execute () - cette fonction planifie la tâche dans une file d'attente pour un seul thread en arrière-plan. Cela signifie que si vous appelez deux AsyncTasks et que vous utilisez la méthode .execute () pour les appeler, ils s'exécuteront dans une file d'attente (en premier, en second lieu).

. executeOnExecutor () - Si vous souhaitez une exécution parallèle des deux AsyncTasks, vous pouvez utiliser cette méthode pour exécuter AsyncTask. Signifie que les deux tâches asynchrones seront exécutées simultanément.

En termes simples: la méthode .execute () crée un seul thread pour l'exécution de asyncTasks, et la méthode .executeOnExecuter () crée un thread séparé pour chaque ayncTask.

.execute exécute les tâches par défaut dans l'ordre série.

EDITED: Si vous voulez utiliser executeOnExecutor (), vous pouvez utiliser ce code:

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

Avant la méthode execute () de HONEYCOMB, exécutez AsynkTask en parallèle.

81
Rahul Sharma