I'm trying to make a simple timer.
package com.anta40.reminder;
import java.util.Timer;
import java.util.TimerTask;
import android.app.Activity;
import android.os.Bundle;
import android.widget.RadioGroup;
import android.widget.TabHost;
import android.widget.TextView;
import android.widget.RadioGroup.OnCheckedChangeListener;
import android.widget.TabHost.TabSpec;
public class Reminder extends Activity{
public final int TIMER_DELAY = 1000;
public final int TIMER_ONE_MINUTE = 60000;
开发者_如何学Go public final int TIMER_ONE_SECOND = 1000;
Timer timer;
TimerTask task;
TextView tv;
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.main);
timer = new Timer();
task = new TimerTask() {
@Override
public void run() {
tv = (TextView) findViewById(R.id.textview1);
tv.setText("BOOM!!!!");
tv.setVisibility(TextView.VISIBLE);
try {
this.wait(TIMER_DELAY);
}
catch (InterruptedException e){
}
tv.setVisibility(TextView.INVISIBLE);
}
};
TabHost tabs=(TabHost)findViewById(R.id.tabhost);
tabs.setup();
TabSpec spec = tabs.newTabSpec("tag1");
spec.setContent(R.id.tab1);
spec.setIndicator("Clock");
tabs.addTab(spec);
spec=tabs.newTabSpec("tag2");
spec.setContent(R.id.tab2);
spec.setIndicator("Settings");
tabs.addTab(spec);
tabs.setCurrentTab(0);
RadioGroup rgroup = (RadioGroup) findViewById(R.id.rgroup);
rgroup.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
if (checkedId == R.id.om){
timer.schedule(task, TIMER_DELAY, 3*TIMER_ONE_SECOND);
}
else if (checkedId == R.id.twm){
timer.schedule(task, TIMER_DELAY, 6*TIMER_ONE_SECOND);
}
else if (checkedId == R.id.thm){
timer.schedule(task, TIMER_DELAY, 9*TIMER_ONE_SECOND);
}
}
});
}
}
Each time I click a radio button, the timer should start, right? But why it doesn't start?
First, you cannot modify the UI from a background thread. So you cannot modify the UI from a TimerTask
.
Second, even if your "BOOM!" logic were on the main application thread, you are not allowing Android to do anything. Android's UI is message- and event-driven. When you call setText()
and setVisibility()
, they do not take effect until you return control to Android. Hence, in your case, you would not see anything, since the TextView
would become invisible immediately after becoming visible.
Third, if you do move your code to the main application thread, do not block that thread, such as with your wait()
call.
精彩评论