Android minuteur de mise à jour d'un textview (UI)
Je suis en utilisant une minuterie pour créer un chronomètre. Le timer fonctionne par l'augmentation d'une valeur entière. Je veux, puis afficher cette valeur dans l'activité par la mise à jour constante d'un textview.
Voici mon code dans le service où je l'ai essayer et de mettre à jour l'activité de l'textview:
protected static void startTimer() {
isTimerRunning = true;
timer.scheduleAtFixedRate(new TimerTask() {
public void run() {
elapsedTime += 1; //increase every sec
StopWatch.time.setText(formatIntoHHMMSS(elapsedTime)); //this is the textview
}
}, 0, 1000);
}
J'ai eu une erreur à propos de la mise à jour de l'INTERFACE utilisateur dans le mauvais thread.
Comment puis-je adapter mon code pour accomplir cette tâche de mise à jour constante de la textview?
- je ne suis pas familier avec le andriod api, mais vous pourriez avoir à manuellement appeler repaint() ou quelle que soit la méthode u utiliser lorsque vous mettez à jour le champ constanlty.
Vous devez vous connecter pour publier un commentaire.
Code ci-dessus fonctionne...
Remarque: les Gestionnaires doivent être créés dans le thread principal, de sorte que vous pouvez modifier le contenu de l'INTERFACE utilisateur.
Vous devez utiliser
Handler
au lieu de mettre à jour l'INTERFACE utilisateur, toutes les X secondes. Voici une autre question que de montrer un exemple: Répéter une tâche avec un temps de retard?Votre approche ne fonctionne pas parce que vous tentez de mettre à jour l'INTERFACE utilisateur de la non-thread d'INTERFACE utilisateur. Ce n'est pas autorisé.
ce bloc de code est basé sur le Gestionnaire, mais vous n'avez pas besoin de créer votre propre Gestionnaire d'instance.
TimerTask implements Runnable, ce qui en ferait un thread. Vous ne pouvez pas mettre à jour l'INTERFACE utilisateur principale de fil directement à partir d'un autre thread sans un peu de travail.
Une chose que vous pourriez faire est d'utiliser Async Tâche de créer de la minuterie et de publier une mise à jour à chaque seconde mise à jour de l'INTERFACE utilisateur.
Je suis en supposant que
StopWatch.time
est statique ou public de référence pour votre TextView. Au lieu de cela, vous devez mettre en œuvre un BroadcastReceiver de communiquer entre votre minuterie (qui s'exécute à partir d'un thread séparé) et votre TextView.Vous pouvez utiliser l'utilitaire suivant :
Puis n'importe où dans le code qui est exécuté par le Thread de l'INTERFACE utilisateur, vous pouvez l'utiliser simplement comme ceci:
vous pouvez utiliser Gestionnaire.
ce code augmenter un compteur de chaque une seconde et afficher et mettre à jour valeur du compteur sur un textView.