web-dev-qa-db-fra.com

Timertask ou gestionnaire

Supposons que je souhaite effectuer une action toutes les 10 secondes sans qu'il soit nécessaire de mettre à jour la vue.

La question qui se pose est la suivante: est-il préférable (je veux dire plus efficace) d'utiliser une minuterie avec timertask comme ici:

final Handler handler = new Handler();

TimerTask timertask = new TimerTask() {
    @Override
    public void run() {
        handler.post(new Runnable() {
            public void run() {
               <some task>
            }
        });
    }
};
timer = new Timer();
timer.schedule(timertask, 0, 15000);
}

ou juste un gestionnaire avec postdelayed

final Handler handler = new Handler(); 
final Runnable r = new Runnable()
{
    public void run() 
    {
        <some task>
    }
};
handler.postDelayed(r, 15000);

Je vous serais également reconnaissant de bien vouloir expliquer quand utiliser quelle approche et pourquoi l’une d’elles est plus efficace que l’autre (si c’est le cas).

91
keysersoze

Handler est meilleur que TimerTask.

Le Java TimerTask et le Android Handler vous permettent de programmer des tâches différées ou répétées sur des threads d'arrière-plan. Cependant, la littérature recommande massivement d’utiliser Handler sur TimerTask dans Android (voir ici , ici , - ici , ici , ici , et ici ).

Certains des problèmes signalés avec TimerTask incluent:

  • Impossible de mettre à jour le fil de l'interface utilisateur
  • Fuites de mémoire
  • Peu fiable (ne fonctionne pas toujours)
  • Des tâches longues peuvent interférer avec le prochain événement planifié

Exemple

La meilleure source pour tous les types d'exemples de Android que j'ai vus se trouve actuellement à l'emplacement est Codepath . Voici un exemple de Handler pour une tâche répétitive.

// Create the Handler object (on the main thread by default)
Handler handler = new Handler();
// Define the code block to be executed
private Runnable runnableCode = new Runnable() {
    @Override
    public void run() {
      // Do something here on the main thread
      Log.d("Handlers", "Called on main thread");
      // Repeat this the same runnable code block again another 2 seconds
      handler.postDelayed(runnableCode, 2000);
    }
};
// Start the initial runnable task by posting through the handler
handler.post(runnableCode);

Connexes

82
Suragch

Il y a quelques inconvénients à utiliser Timer

Il ne crée qu'un seul thread pour exécuter les tâches et si une tâche prend trop de temps à s'exécuter, d'autres tâches en pâtissent. Il ne gère pas les exceptions levées par les tâches et le thread se termine juste, ce qui affecte d’autres tâches planifiées et elles ne sont jamais exécutées.

Copié de:

TimerTask vs Thread.sleep vs Handler postDelayed - plus précis pour appeler la fonction toutes les N millisecondes?

17
Praveena

version Kotlin de la réponse acceptée:

val handler = Handler()

val runnableCode = object : Runnable {
    override fun run() {
       Log.d("Handlers", "Called on main thread")
       handler.postDelayed(this, 2000)
    }
}

handler.post(runnableCode)
1
sma6871