Android: AsyncTask OU threads Java normaux avec ExecutorService

Mon application utilise un Service pour créer des éléments d’arrière-plan. J’utilise des threads supplémentaires dans le service pour effectuer des calculs. Pour ce faire, je crée deux threads toutes les 5 à 10 secondes, qui s’exécutent entre 5 et 10 secondes. Mais je ne sais pas quel modèle de fil je devrais utiliser:

  1. AsyncTask:

    Avantages:

    • facile à utiliser
    • Android spécifique
    • interaction d’interface utilisateur facile

    Les inconvénients:

    • Étant donné que je dois utiliser le niveau 10 de l’API, il n’y a pas d’ ExecutorService avec un pool de threads fixe pour exécuter les tâches Async.
  2. Fils Java normaux:

    Avantages:

    • ExecutorService avec pool de threads fixe

    Les inconvénients:

    • Pas facile à manipuler, p.ex. interaction avec l’interface utilisateur

Quel modèle est préférable d’utiliser? Surtout par souci de performance. Existe-t-il une lourde charge lorsque j’utilise AsyncTasks et ExecutorService est-il plus rapide à réutiliser les threads qu’Android lors de la création de nouvelles AsyncTasks?

Si vous regardez l’implémentation d’ AsyncTask , vous verrez qu’il utilise son propre pool de threads à l’aide de “threads Java normaux”.

Existe-t-il une lourde charge lorsque j’utilise AsyncTasks et ExecutorService est-il plus rapide à réutiliser les threads qu’Android lors de la création de nouvelles AsyncTasks?

Il ne devrait y avoir aucune différence substantielle entre les deux.

J’utilise Needle; une bibliothèque multithreading open source, simple et puissante pour Android. Avec cela, vous pouvez dire des choses comme:

 Needle.onMainThread().execute(new Runnable() { @Override public void run() { // eg change one of the views } }); 

ou

 Needle.onBackgroundThread().execute(new UiRelatedTask() { @Override protected Integer doWork() { int result = 1+2; return result; } @Override protected void thenDoUiRelatedWork(Integer result) { mSomeTextView.setText("result: " + result); } }); 

Avantages

  • API très simple
  • taille de pool de threads fixe
  • taille du pool de threads personnalisable
  • prend en charge l’interaction avec l’interface utilisateur (“travaille, puis utilise le résultat sur le fil d’interface utilisateur”)
  • Android 1.5+
  • se comporte de la même manière sur toutes les versions de la plateforme

Les inconvénients

  • dépendance supplémentaire de la bibliothèque

Découvrez le sur GitHub: https://github.com/ZsoltSafrany/needle