Android: einfache Zeit-Zähler
Ich habe ein einfaches Programm mit einer TextView und zwei Buttons: Button1 und Button2.
Einem Klick auf die Schaltfläche 1 startet einen Zähler, eine Steigerung um 1 alle 1 Sekunde und zeige das Ergebnis auf TextView; klirrend auf die Taste 2 wird Sie aufhalten. Hier ist ein Teil von meinem code für Button1. Aber es funktioniert nicht.
Timer T=new Timer();
T.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
myTextView.setText("count="+count);
count++;
}
}, 1000, 1000);
Ich weiß, dass es einige ähnliche Fragen zu diesem Thema mit Thread, aber es scheint, wie Sie tun, nicht zu erwähnen, stoppen die Zähler.
Jeder Vorschlag wird sehr geschätzt.
Hinzugefügt:
Hallo, ich habe gerade verkürzt mein code nur aus ein viel größeres Programm, aber es ist immer noch abgestürzt:
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;
}
}
Die log-Datei (ich will nicht posten, weil es zu lang ist, aber jemand, der es beantragt):
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)
InformationsquelleAutor der Frage DavidNg | 2012-07-30
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie sich vorstellen Flagge. So etwas wie
isPaused
. Auslöser dieses flag, wenn die 'Pause' - Taste gedrückt. Check-flag-Wert in der timer-Aufgabe. Erfolg.InformationsquelleAutor der Antwort Pavel Dudka
Chekout diese Beispiel, verwendet die Chronometer Klasse: http://android-er.blogspot.com/2010/06/android-chronometer.html
Mit dem Chronometer-Klasse sparen Sie die Verwaltung der thread selbst.
InformationsquelleAutor der Antwort hovanessyan
Pavel ist auf dem richtigen Weg mit zu stoppen, außer seine Antwort ist eine Verschwendung, da es nicht stoppen Sie den Timer. Tun Sie dies auf den Teil, den er veröffentlicht, mit dem zusätzlichen else-Anweisung:
Oh, und Sie sagte, es ist abgestürzt. Wir haben keine Ahnung, warum es zu Abstürzen, so können wir leider nicht wirklich helfen, herauszufinden, warum sein tun, es sei denn, wir sehen mehr code und die Fehlermeldung.
Guten Fang @yorkw Das problem ist offensichtlich mit etwas, was Ihr zu tun versucht, wenn Ihr beginnt zu laufen. Seit seiner sagt "Timer-0", das bedeutet, es startet nie offiziell und es stecken in diesem Teil. Erste Regel der ausgeführten threads, NIE ÄNDERN, UI-ELEMENTE, DIE VON AUßERHALB des UI -. Ich würde vorschlagen, mit
runOnUiThread
wie york sagte. Hier ist ein link wie man es benutzt: runOnUiThread.Ziemlich sicher
TimerTask
ist ein runnable d.h. es läuft in einem separaten thread. Mindestens das ist, was ich bemerkte, auf die docs.InformationsquelleAutor der Antwort Andy
Perfekte Lösung, wenn Sie wollen-display mit Uhr.
InformationsquelleAutor der Antwort Giedrius Šlikas