安卓基础学习 Day28 |定时器(Timer + TimerTask)

本文详细介绍了Java中Timer和TimerTask的使用方法,包括实例化、调度任务、注意事项,以及如何在UI线程中正确更新组件。重点讲解了如何处理定时任务的重复执行和UI更新问题,适合Android开发者学习定时任务管理。
摘要由CSDN通过智能技术生成

写在前面的话

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 效果展示
在这里插入图片描述

补充

1、Timer、TimerTask的简单应用及如何解决多次调度相同任务

2、java中定时器Timer/TimerTask的使用方法

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值