用Handler和Timertask实现一个简单的定时器
Handler的使用:
1,定义Handler重载handleMessage方法,handleMessage为处理消息的方法,如下:
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
show.setText("" + msg.arg1);
}
};
2,发送消息
Message message = handler.obtainMessage();
message.arg1 = i;//如果是自定义对象可用message.obj
handler.sendMessage(message);
TimerTask和Timer的使用:
1,TimerTask是定时任务,重载其中的run方法,定时任务便在此方法中执行,
task = new TimerTask() {
@Override
public void run() {
//要执行的定时任务写在此处
}
};
2,通过Timer启动任务,可以这样用:
timer.schedule(task, 1000);//延迟1000毫米执行定时任务
schedule方法启动任务并设置执行和延迟时间,有多个重载方法,其中的task参数为TimerTask实例
中途取消任务可用TimerTask类的cancel()方法。
Handler和Timer依次相互调用即可实现计时功能
代码如下:
public class MainActivity extends Activity {
private EditText et1;
private TextView show;
private Button start, stop;
private int i = 0;
private Timer timer;
private TimerTask task;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
}
private void initView() {
et1 = (EditText) findViewById(R.id.editText1);
show = (TextView) findViewById(R.id.textView1);
start = (Button) findViewById(R.id.button1);
stop = (Button) findViewById(R.id.button2);
start.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
startTime();// 开始计时
}
});
stop.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
stopTime();// 停止计时
}
});
show.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
String str = et1.getText().toString();
if (str != null && !"".equals(str)) {
i = Integer.parseInt(str);// 设置计时的开始时间
show.setText("" + i);
}
}
});
}
private void startTime() {
timer = new Timer();
task = new TimerTask() {
@Override
public void run() {
i--;
Message message = handler.obtainMessage();
message.arg1 = i;// 如果是自定义对象可用message.obj
handler.sendMessage(message);
}
};
timer.schedule(task, 1000);// 延迟1000毫米执行定时任务
}
private void stopTime() {
task.cancel();// 取消定时任务
}
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
show.setText("" + msg.arg1);
if (i > 0) {// 如果时间大于0循环调用
startTime();
}
}
};
}