countdown timer plus_Android10使用

countdown timer plus_Android10使用AndroidCountDownTimer的使用

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

最近博主需要实现一个倒计时相关的功能,被推荐了Android的CountDownTimer工具类,在此说一下CountDownTimer的使用以及源码的解读

以下是一个总计10秒倒计时,每间隔1秒进行回调的例子:

        CountDownTimer timer = new CountDownTimer(10000, 1000) {
            @Override
            public void onTick(long millisUntilFinished) {
                // do something
            }

            @Override
            public void onFinish() {
                // do something
            }
        };
        timer.start();

每间隔1秒,CountDownTimer便会调用onTick回调方法执行相应操作

当倒计时结束后,CountDownTimer会调用onFinish回调方法执行相应的操作

看完CountDownTimer的例子后,我们可以看一下CountDownTimer的源码以加深对该工具类的理解,源码如下:

public abstract class CountDownTimer {

    /**
     * Millis since epoch when alarm should stop.
     */
    private final long mMillisInFuture;

    /**
     * The interval in millis that the user receives callbacks
     */
    private final long mCountdownInterval;

    private long mStopTimeInFuture;
    
    /**
    * boolean representing if the timer was cancelled
    */
    private boolean mCancelled = false;

    /**
     * @param millisInFuture The number of millis in the future from the call
     *   to {@link #start()} until the countdown is done and {@link #onFinish()}
     *   is called.
     * @param countDownInterval The interval along the way to receive
     *   {@link #onTick(long)} callbacks.
     */
    public CountDownTimer(long millisInFuture, long countDownInterval) {
        mMillisInFuture = millisInFuture;
        mCountdownInterval = countDownInterval;
    }

    /**
     * Cancel the countdown.
     */
    public synchronized final void cancel() {
        mCancelled = true;
        mHandler.removeMessages(MSG);
    }

    /**
     * Start the countdown.
     */
    public synchronized final CountDownTimer start() {
        mCancelled = false;
        if (mMillisInFuture <= 0) {
            onFinish();
            return this;
        }
        mStopTimeInFuture = SystemClock.elapsedRealtime() + mMillisInFuture;
        mHandler.sendMessage(mHandler.obtainMessage(MSG));
        return this;
    }


    /**
     * Callback fired on regular interval.
     * @param millisUntilFinished The amount of time until finished.
     */
    public abstract void onTick(long millisUntilFinished);

    /**
     * Callback fired when the time is up.
     */
    public abstract void onFinish();


    private static final int MSG = 1;


    // handles counting down
    private Handler mHandler = new Handler() {

        @Override
        public void handleMessage(Message msg) {

            synchronized (CountDownTimer.this) {
                if (mCancelled) {
                    return;
                }

                final long millisLeft = mStopTimeInFuture - SystemClock.elapsedRealtime();

                if (millisLeft <= 0) {
                    onFinish();
                } else {
                    long lastTickStart = SystemClock.elapsedRealtime();
                    onTick(millisLeft);

                    // take into account user's onTick taking time to execute
                    long lastTickDuration = SystemClock.elapsedRealtime() - lastTickStart;
                    long delay;

                    if (millisLeft < mCountdownInterval) {
                        // just delay until done
                        delay = millisLeft - lastTickDuration;

                        // special case: user's onTick took more than interval to
                        // complete, trigger onFinish without delay
                        if (delay < 0) delay = 0;
                    } else {
                        delay = mCountdownInterval - lastTickDuration;

                        // special case: user's onTick took more than interval to
                        // complete, skip to next interval
                        while (delay < 0) delay += mCountdownInterval;
                    }

                    sendMessageDelayed(obtainMessage(MSG), delay);
                }
            }
        }
    };
}

源码并不算长,CountDownTimer作为一个抽象类,其主要方法有如下几个:

  • start:开始进行倒计时
  • cancel:取消倒计时
  • onTick:抽象方法,用于倒计时间隔回调
  • onFinish:抽象方法,用于倒计时结束时回调
看过CountDownTimer的源码后,有几个细节我们需要稍微注意一下:
  1. 在源码第38行中,CountDownTimer会判断是否倒计时已结束,如果是则调用onFinish方法,否则调用onTick方法。因此,在倒计时的最后一秒时,我们并不会收到onTick的回调,取而代之的是onFinish的回调。
  2. 从源码可以看出,CountDownTimer其实与Timer完全没有任何关系,它的倒计时实现是使用Handler机制实现的,因此当我们在非UI线程使用该工具时,需要先初始化Looper
  3. 同上,由于CountDownTimer是基于Handler实现的,其处理以及发送message以及回调onTick处于同一线程,因此当我们在回调方法onTick耗时过多时,可能会影响CountDownTimer预估的回调次数(见源码144行)

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/192397.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • RocketMQ和Kafka应用场景与选型[通俗易懂]

    RocketMQ和Kafka应用场景与选型[通俗易懂]1、适用场景kafka适合日志处理rocketmq适合业务处理结论:两者没有区别,根据具体业务定夺2、性能kafka单机写入TPS号称在百万条/秒rocketmq大约在10万条/秒结论:追求性能方面,kafka单机性能更高3、可靠性kafka使用异步刷盘方式,异步Replicationrocketmq支持异步/同步刷盘,异步/同步Replication结论:rocketmq所支持的同步方式提升了数据的可靠性4、实时性kafka和rocketmq均支持pull长轮询,rocketmq

    2022年10月14日
  • 拒绝接口裸奔!开放API接口签名验证!

    拒绝接口裸奔!开放API接口签名验证!

  • 因果图法_软件测试因果图怎么画

    因果图法_软件测试因果图怎么画一、黑盒测试:是一种常用的软件测试方法,它将被测软件看作一个打不开的黑盒,主要根据功能需求设计测试用例,进行测试。几种常用的黑盒测试方法和黑盒测试工具有,等价类划分法、边界值分析法、因果图法、决策表法。在实际运用中要选择合适的方法。二、因果图法:等价类划分法和边界值分析方法都是着重考虑输入条件,如果程序输入之间没有什么联系,采用等价类划分和边界值分析是一种比较有效的方法。如果输入之间有关系,例…

  • Drupal8的详细建站教程

    Drupal8的详细建站教程什么是drupal?    drupal是一个好用且功能强大的内容管理系统(CMS),通常也被称为是内容管理框架(CMF),由来自全世界各地的开发人员共同开发和维护,目前最新版本是Drupal8。安装drupal所需基础    建站环境:Windows或Linux操作系统   Web服务器:Apache,Nginx,Lighttpd,或微软的IIS服务器,

  • Lamp架构_10个人公司的架构图

    Lamp架构_10个人公司的架构图一:LAMP架构简介LAMP是目前成熟的一种企业网站应用模式之一,指的是协同工作的一套系统和相关软件的整合,可提供PHP动态web站点应用及开发环境,LAMP经过十年的完善各个组件间的兼容性,协作能力,稳定等方面也不断增强(注:Apache服务是一个静态网站,它里面的测试页都是以HTML的格式结尾,以HTML写出的网站都是静态的,没有什么功能,没有办法去关联后台的数据库,所以说他只能做一个展示的页面,LAMP构建出来就是一个动态网页的一个后台,PHP是一种动态网站开发语言,…

    2022年10月16日
  • 关于getchar的用法及实例解析

    关于getchar的用法及实例解析getchar——读取字符的函数intgetchar(void)返回类型为int,参数为void.有人可能会有疑惑,getchar既然是读取字符的,为什么返回类型是int呢?1、getchar其实返回的是字符的ASCII码值(整数)。2、getchar在读取结束或者失败的时候,会返回EOF。EOF意思是endoffile,本质上是-1.下面我们一起来看看下面这段代码什么意思#include<stdio.h>intmain(){ intch=0; wh

    2022年10月19日

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号