布局:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".Activity14"
android:padding="20dp">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="点击开启倒计时"
android:textSize="23sp"
android:gravity="center"/>
<Button
android:id="@+id/start"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:text="Handler开始"/>
<Button
android:id="@+id/begin"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/start"
android:layout_centerHorizontal="true"
android:text="Timer开始"/>
<Button
android:id="@+id/btn"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="返回"
android:layout_alignParentBottom="true"/>
</RelativeLayout>
方法一:使用Handler
// 点击按钮开始计时
start.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
start.setEnabled(false);
new Thread(){
@Override
public void run() {
super.run();
while (time > 0){
time--;
handler.sendEmptyMessage(START_TIME);
try {
//延时是一秒
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
handler.sendEmptyMessage(END_TIME);
}
}.start();
}
});
Handler接收到消息刷新页面UI
final Handler handler=new Handler(){
@Override
public void handleMessage(@NonNull Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case START_TIME:
start.setText("Handler剩余时间" + time);
break;
case END_TIME:
start.setEnabled(true);
start.setText("Handler重新开始");
time = 10;
break;
}
}
};
方法二:使用Timer(Timer是Android直接启动定时器的类,TimerTask是一个子线程,方便处理一些比较复杂耗时的功能逻辑)
// 点击按钮开启计时器
begin.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 定义计时器
timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
handler.sendEmptyMessage(BEGIN_TIME);
}
},0, 1000); //延时0毫秒开始计时,每隔1秒计时一次
}
});
Handler接收到消息刷新页面UI
final Handler handler=new Handler(){
@Override
public void handleMessage(@NonNull Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case BEGIN_TIME:
if (time > 0) {
begin.setEnabled(false);
begin.setText("Timer剩余时间" + time);
time--;
} else {
// 关闭计时器
timer.cancel();
begin.setEnabled(true);
begin.setText("Timer重新开始");
time = 10;
}
break;
}
}
};