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).
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:
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
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:
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)