参考:https://blog.csdn.net/qq_43745685/article/details/126617335
Timer和TimerTask
这是常规的实现方式,对于大多数人的选择都会采用这种方式实现定时任务。这种实现方式的生命周期和Acticity的生命周期一样,当Activity销毁后,该定时任务也会结束。即退出该应用时,定时任务结束。
void scheduleAtFixedRate(TimerTask task, long delay, long period) 在指定的延迟时间后开始执行任务,并且之后每隔指定的时间执行一次。
void scheduleAtFixedRate(TimerTask task, Date firstTime, long period) 在指定的时间点开始执行任务,之后每隔指定的时间执行一次。可用于每天的某个时间点执行一次。
Timer timer = new Timer(); TimerTask timerTask = new TimerTask() { @Override public void run() { runOnUiThread(new Runnable() { @Override public void run() { tvDesc.setText(String.valueOf(counts++)); } }); } }; //参数说明: //第二个:指定延时多少毫秒开始执行 //第三个:指定每隔多少毫秒执行一次 //timer.cancel();// 停止定时器 timer.schedule(timerTask, 0, 1000);
防止多次点击
btnStop.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (timer != null) { timer.cancel();// 停止定时器 timer = null; } } }); btnStart.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //防止多次点击开启计时器 if (timer != null) { timer.cancel(); timer = null; } if (timerTask != null){ timerTask = null; } timerTask = new TimerTask() { @Override public void run() { runOnUiThread(new Runnable() { @Override public void run() { counts++; tvDesc.setText(String.valueOf(counts)); } }); } }; timer = new Timer(); timer.schedule(timerTask, 0, 1000); } });
自带定时器 CountDownTimer
常用方法:
方法1:cancel(): 取消当前的任务
方法2:onFinish(): 当前任务完成的时候回调
方法3:onTick(long millisUntilFinished): 当前任务每完成一次倒计时间隔时间时回调
方法4:start(): 开始当前的任务
CountDownTimer countDownTimer = new CountDownTimer(10000,1000) { @Override public void onTick(long l) { //l参数是当前计时任务的进度: //在这个例子中的值是:9000 8000 7000 6000等 //这里面是可以直接更新UI的 tvDesc.setText(String.valueOf(counts++)); } //时间段内最后一次定时任务 @Override public void onFinish() { tvDesc.setText(String.valueOf(counts++) + " finished!"); } }; countDownTimer.start();
使用Handler的postDelayed方法
只启动一次
new Handler().postDelayed(new Runnable() { @Override public void run() { //直接改控件 和 runOnUiThread 都可以 counts++; tvDesc.setText(String.valueOf(counts)); // runOnUiThread(new Runnable() { // @Override // public void run() { // counts++; // tvDesc.setText(String.valueOf(counts)); // } // }); } }, 1000);//延时1s执行
一直重复
Handler handler = new Handler(); Runnable runnable = new Runnable() { @Override public void run() { runOnUiThread(new Runnable() { @Override public void run() { counts++; tvDesc.setText(String.valueOf(counts)); } }); handler.postDelayed(this,1000); } }; handler.postDelayed(runnable,50);//启动定时任务 // 使用下面方式停止定时任务 //handler.removeCallbacks(runnable);
示例:5秒没活动,隐藏按钮。
package com.jay.myappstudy; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.TextView; import java.util.Timer; import java.util.TimerTask; public class TimerTestActivity extends AppCompatActivity { private int counts = 0; private TextView tvDesc; private TextView tvDesc2; private Button btnStop; private Button btnStart; private Button btnActivity; // 计时器 private Timer timer; // 定时任务 private TimerTask timerTask; // 是否页面有活动,点击页面按钮时设置为true,定时任务超过15秒设置为false private boolean haveAct = true; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_timer_test); tvDesc = findViewById(R.id.tvDesc); tvDesc2 = findViewById(R.id.tvDesc2); btnStop = findViewById(R.id.btnStop); btnStart = findViewById(R.id.btnStart); btnActivity = findViewById(R.id.btnActivity); btnActivity.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { haveAct = true; tvDesc2.setVisibility(View.VISIBLE); } }); btnStop.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (timer != null) { timer.cancel();// 停止定时器 timer = null; } } }); btnStart.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //防止多次点击开启计时器 if (timer != null) { timer.cancel(); timer = null; } if (timerTask != null) { timerTask = null; } timerTask = new TimerTask() { @Override public void run() { runOnUiThread(new Runnable() { @Override public void run() { counts++; tvDesc.setText(String.valueOf(counts)); if (haveAct) { tvDesc2.setVisibility(View.VISIBLE); haveAct = false; } else { tvDesc2.setVisibility(View.GONE); } } }); } }; timer = new Timer(); // 定时任务,每5秒执行一次,进入判断。 timer.schedule(timerTask, 0, 5000); } }); } }
线程池定时执行:https://www.cnblogs.com/xsj1989/p/17619462.html