Android: compteur de temps simple
J'ai un programme simple avec un TextView et de deux Boutons: Bouton1 et Bouton2.
Cliquant sur le Bouton 1 démarre un compteur augmente de 1 toutes les 1 seconde et montrer le résultat sur TextView; cliquez sur le Bouton 2 va l'arrêter. Voici une partie de mon code pour Button1. Mais il ne fonctionne pas.
Timer T=new Timer();
T.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
myTextView.setText("count="+count);
count++;
}
}, 1000, 1000);
Je sais qu'il y a des questions similaires à propos de ce à l'aide de Fil, mais il semble qu'ils ne pas mentionner à propos de l'arrêt du compteur.
Toute suggestion est vraiment apprécié.
Ajouté:
Bonjour, je viens de raccourcir mon code à partir d'un beaucoup plus grand programme, mais il est encore écrasé:
package com.example.hello;
import java.util.Timer;
import java.util.TimerTask;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.widget.TextView;
public class MainActivity extends Activity {
TextView myTextView;
int count=0;
Timer T;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
myTextView=(TextView)findViewById(R.id.t);
T=new Timer();
T.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
myTextView.setText("count="+count);
count++;
}
}, 1000, 1000);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
}
Le fichier journal (je ne veux pas poster ce parce que c'est trop long, mais quelqu'un l'a demandé):
07-28 17:35:07.012: W/dalvikvm(11331): threadid=7: thread exiting with uncaught exception (group=0x4001d800)
07-28 17:35:07.016: E/AndroidRuntime(11331): FATAL EXCEPTION: Timer-0
07-28 17:35:07.016: E/AndroidRuntime(11331): android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
07-28 17:35:07.016: E/AndroidRuntime(11331): at android.view.ViewRoot.checkThread(ViewRoot.java:2802)
07-28 17:35:07.016: E/AndroidRuntime(11331): at android.view.ViewRoot.requestLayout(ViewRoot.java:594)
07-28 17:35:07.016: E/AndroidRuntime(11331): at android.view.View.requestLayout(View.java:8125)
07-28 17:35:07.016: E/AndroidRuntime(11331): at android.view.View.requestLayout(View.java:8125)
07-28 17:35:07.016: E/AndroidRuntime(11331): at android.view.View.requestLayout(View.java:8125)
07-28 17:35:07.016: E/AndroidRuntime(11331): at android.view.View.requestLayout(View.java:8125)
07-28 17:35:07.016: E/AndroidRuntime(11331): at android.widget.RelativeLayout.requestLayout(RelativeLayout.java:254)
07-28 17:35:07.016: E/AndroidRuntime(11331): at android.view.View.requestLayout(View.java:8125)
07-28 17:35:07.016: E/AndroidRuntime(11331): at android.widget.TextView.checkForRelayout(TextView.java:5378)
07-28 17:35:07.016: E/AndroidRuntime(11331): at android.widget.TextView.setText(TextView.java:2688)
07-28 17:35:07.016: E/AndroidRuntime(11331): at android.widget.TextView.setText(TextView.java:2556)
07-28 17:35:07.016: E/AndroidRuntime(11331): at android.widget.TextView.setText(TextView.java:2531)
07-28 17:35:07.016: E/AndroidRuntime(11331): at com.example.hello.MainActivity$1.run(MainActivity.java:21)
07-28 17:35:07.016: E/AndroidRuntime(11331): at java.util.Timer$TimerImpl.run(Timer.java:289)
source d'informationauteur DavidNg | 2012-07-30
Vous devez vous connecter pour publier un commentaire.
Vous pouvez introduire drapeau. Quelque chose comme
isPaused
. Déclencheur de cet indicateur lorsque la "Pause", bouton enfoncé. Vérifier la valeur de l'indicateur dans votre minuterie tâche. Succès.Chekout cette exemple, qui utilise le Chronomètre classe: http://android-er.blogspot.com/2010/06/android-chronometer.html
En utilisant le Chronomètre classe va vous sauver la gestion de la thread de vous-même.
Pavel est sur la bonne voie avec l'arrêt de celui-ci, sauf sa réponse est un gaspillage puisqu'il n'a pas l'arrêt de la Minuterie. Cela, sur le rôle qu'il a publié, avec le else:
Oh, et vous avez dit qu'il s'est écrasé. Nous n'avons aucune idée de pourquoi ça plante, donc, malheureusement, on ne peut pas vraiment aider à comprendre pourquoi sa fait que si nous ne voyons plus de code et l'erreur.
Bonne prise @yorkw Le problème est évidemment avec quelque chose de son en essayant de faire quand sa commence à courir. Depuis son dit "Timer-0", cela signifie qu'il ne démarre officiellement et il est coincé dans la partie. Première règle de threads en cours d'exécution, JAMAIS CHANGER les ÉLÉMENTS de l'INTERFACE utilisateur de l'EXTÉRIEUR DE L'INTERFACE utilisateur. Je conseille
runOnUiThread
comme york, a déclaré. Voici un lien sur la façon de l'utiliser: runOnUiThread.Assez sûr
TimerTask
est un exécutable sens, il fonctionne sur un thread séparé. Moins c'est ce que j'ai remarqué sur les docs.Solution idéale si vous souhaitez afficher l'exécution de l'horloge.