写在前面的话
1、参考自网络。
2、内容如果有不对的,希望可以指出或补充。
3、新知识。
一、概述
Timer( 定时器):是一种定时器工具,用来在一个后台单线程(较安全)计划执行指定任务。它可以【固定时间或延迟时间】计划执行一个任务(耗时短的任务,比如倒计时发送验证码)一次或反复多次。无法保证时间精确度。
TimerTask( 定时器任务):一个抽象类,其中含有一个抽象方法run(),它的子类代表一个可以被Timer(定时器)计划的任务。
注:每一个Timer(定时器)仅对应唯一 一个线程,多个TimerTask可以共用一个Timer。
二、使用
//1、实例化Timer对象
Timer timer = new Timer();
//2、实例化TimerTask对象
TimerTask timerTask = new TimerTask(){
@Override
public void run(){
//需要执行的具体操作
}
};
//3、启动定时器
//表示延迟多少(单位毫秒,long类型-多长时间或Date类型-哪个时间)后开始,以多少周期(单位毫秒,long类型)来重复执行
timer.schedule(timerTask, delay, period);
//4、关闭定时器
//所有使用该同一个定时器的TimerTask在定时器关闭后也会被关闭
timer.cancel();
【注意点】
- 1、Timer和TimerTask的对象只能用一次,所以如果想多次调同一任务,必须重新实例化。
- 2、
只能在UI主线程中更新控件/组件
(可通过Handler-各处线程间的消息传递)⬇ - ⬆ 扩展:由于Android采用的是单线程模式,开发者无法在子线程中更新 UI,所以系统提供了 Handler 这个类来实现 UI 更新问题。
- 3、Timer(定时器)用完后,需要cancel,否则定时器的线程会一直存在。
三、测试
1 布局略
2 代码部分
MainActivity.java
package com.example.testworked;
import androidx.appcompat.app.AppCompatActivity;
import android.app.AlertDialog;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import java.util.Timer;
import java.util.TimerTask;
public class MainActivity extends AppCompatActivity {
private Timer timer;
private Handler handler;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//获取控件
TextView testTv = findViewById(R.id.test_tv);
Button testBtn = findViewById(R.id.test_btn);
//定义Handler
handler = new Handler() {
int i;
public void handleMessage(Message msg) {
i = msg.what;
testTv.setText("倒计时:" + i);
if (i == 0) {
timer.cancel();//退出Timer
if(timer != null){
testTv.setText("");
//普通弹窗
AlertDialog dialog = new AlertDialog.Builder(MainActivity.this)
.setTitle("测试完毕")
.setIcon(R.mipmap.ic_launcher)
.create();//确定创建
dialog.show();//显示弹窗
}
}
}
};
//点击事件
testBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//1、实例化Timer对象
timer = new Timer();
//2、实例化TimerTask对象
TimerTask timerTask = new TimerTask() {
int i=5;
@Override
public void run() {
Log.i("调用run()方法的线程--》当前线程", Thread.currentThread().getName());
//定义一个消息传递出去
Message msg = new Message();
msg.what = i--;
handler.sendMessage(msg);
}
};
//3、启动
timer.schedule(timerTask, 1000, 1000);//延时1s后执行,1s执行一次
}
});
}
}
3 效果展示