目录
一、实验内容
实现一个倒计时时钟,创建子线实现计时功能,使用异步消息机制将计时结果显示在界面上,在文本框中输入数字(使用Number文本框),点击开始按钮后,下方文本框的数字每秒减1,点击停止即停止倒计时。
二、实验过程和结果
1、首先设置布局,包括两个Button(btnStart和btnStop,分别用于开始和停止倒计时),一个Number文本框,用于用户设置倒计时的开始时间。
2、创建Handler对象,从中获取控件,并在里面对UI进行改变操作。Handler是安卓提供的一套异步消息处理机制。
3、实现btnStart点击事件,在里面获取一次Number文本框,得到用户输入的倒计时开始时间。isWork用于判断是否暂停计时,当它为true是正常执行线程中的内容,即正常计时。当它为false时,则不执行线程中的内容,达到计时暂停效果。线程中创建了一个Message对象,之后调用了Handler的sendMessage()方法将这条Message发送出去。接着Handler就会收到这条Message,并在handleMessage()方法中对它进行处理,注意handleMessage()中的代码是在主线程当中运行的。Thread.sleep(1000)为间隔一秒执行。注意要最后要在结尾启动线程,“.start()”。
4、当点击btnStop按钮时,将isWork置为false。
5、程序运行结果如图。
三、代码
package com.example.lab.mytimer;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
public class MainActivity extends AppCompatActivity {
boolean isWork;
String number;
EditText edtNumber;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button btnStart=(Button)findViewById(R.id.btn_start);
Button btnStop=(Button)findViewById(R.id.btn_stop);
final Handler handler=new Handler(){
@Override
public void handleMessage(Message msg) {
edtNumber=(EditText)findViewById(R.id.editText);
edtNumber.setText(String.valueOf(msg.what));
}
};
btnStart.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
EditText edtCount=(EditText)findViewById(R.id.editText);
number=String.valueOf(edtCount.getText());
isWork=true;
new Thread(new Runnable() {
@Override
public void run() {
try{
for(int i=Integer.valueOf(number)-1;i>=0;i--){
if(isWork){
//间隔一秒
Thread.sleep(1000);
Message msg=new Message();
msg.what=i;
handler.sendMessage(msg);
}
}
}catch(Exception e){
e.printStackTrace();
}
}
}).start();
}
});
btnStop.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(isWork){
//停止
isWork=false;
}
}
});
}
}