参考: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

posted on 2023-10-27 10:10  邢帅杰  阅读(509)  评论(0编辑  收藏  举报