J'ai développé une application pour afficher du texte à des intervalles définis dans l'écran de l'émulateur Android. J'utilise la Handler
classe. Voici un extrait de mon code:
handler = new Handler();
Runnable r = new Runnable() {
public void run() {
tv.append("Hello World");
}
};
handler.postDelayed(r, 1000);
Lorsque j'exécute cette application, le texte ne s'affiche qu'une seule fois. Pourquoi?
android
multithreading
Rajapandian
la source
la source
Réponses:
La solution simple à votre exemple est:
Ou nous pouvons utiliser un fil normal par exemple (avec le Runner d'origine):
Vous pouvez considérer votre objet exécutable comme une commande qui peut être envoyée à la file d'attente de messages pour exécution et le gestionnaire comme un simple objet d'aide utilisé pour envoyer cette commande.
Plus de détails sont ici http://developer.android.com/reference/android/os/Handler.html
la source
la source
Je pense que peut améliorer la première solution d'Alex2k8 pour une mise à jour correcte chaque seconde
1. code d'origine:
2. analyse
tv.append("Hello Word")
coût T millisecondes, après l'affichage, 500 fois le temps différé est de 500 * T millisecondes3. Solution
Pour éviter cela, il suffit de changer l'ordre de postDelayed (), pour éviter les retards:
la source
Pour répéter la tâche, vous pouvez utiliser
appelle ça comme
Où
tâche étant la méthode à exécuter
après le temps de l'exécution initiale
( intervalle de temps pour répéter l'exécution)
Deuxièmement
Et vous pouvez également utiliser CountDownTimer si vous souhaitez exécuter un nombre de tâches plusieurs fois.
Et vous pouvez également le faire avec runnable. créer une méthode exécutable comme
Et appelez-le de ces deux façons
OU
la source
Je crois que pour ce cas typique, c'est-à-dire pour exécuter quelque chose avec un intervalle fixe,
Timer
est plus approprié. Voici un exemple simple:L'utilisation
Timer
présente peu d'avantages:schedule
arguments de la fonctionmyTimer.cancel()
myTimer.cancel()
avant d'en planifier un nouveau (si myTimer n'est pas nul)la source
la source
r
qui est encore définie.Si je comprends bien la documentation de la méthode Handler.post ():
Donc, les exemples fournis par @ alex2k8, même s'ils fonctionnent correctement, ne sont pas les mêmes. Dans le cas, où
Handler.post()
est utilisé, aucun nouveau thread n'est créé . Vous venez de publierRunnable
sur le fil avecHandler
pour être exécuté par EDT . Après cela, EDT n'exécute queRunnable.run()
rien d'autre.Rappelez - vous:
Runnable != Thread
.la source
Kotlin
Java
la source
Un exemple intéressant est que vous pouvez voir en continu un compteur / chronomètre fonctionnant dans un thread séparé. Affiche également la position GPS. Alors que l'activité principale Thread d'interface utilisateur est déjà là.
Extrait:
Pour voir le code, voir ici:
Exemple de thread affichant la position GPS et l'heure courante avec le thread d'interface utilisateur de l'activité principale
la source
maintenant dans Kotlin, vous pouvez exécuter des threads de cette façon:
la source
Kotlin avec Coroutines
Dans Kotlin, en utilisant des coroutines, vous pouvez effectuer les opérations suivantes:
Essayez-le ici !
la source