Android CountDownTimer案例总结

 更新时间:2021年08月18日 16:05:05   作者:weixin_42564441  
这篇文章主要介绍了Android CountDownTimer案例总结,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下

一、概述

项目中经常用到倒计时的功能,比如说限时抢购,手机获取验证码等等。而google官方也帮我们封装好了一个类:CountDownTimer,使我们的开发更加方便;

二、API

CountDownTimer是一个抽象类,有两个抽象方法,它的API很简单

public abstract void onTick(long millisUntilFinished);//这个是每次间隔指定时间的回调,millisUntilFinished:剩余的时间,单位毫秒
public abstract void onFinish();//这个是倒计时结束的回调

使用的时候只需要

new CountDownTimer(long millisInFuture, long countDownInterval)
//millisInFuture:倒计时的总时长
//countDownInterval:每次的间隔时间  单位都是毫秒

三、基本使用方法

我们以短信验证码的倒计时来看,点击获取验证码,倒计时60s不可点击

new CountDownTimer(60 * 1000, 1000) {
    @Override
    public void onFinish() {
        if (tvCode != null) {
            tvCode.setText("重新获取");
            tvCodeWr.setTextColor(Color.parseColor("#E94715"));
            tvCode.setClickable(true);
            tvCode.setEnabled(true);
        }

        cancel();
    }

    @Override
    public void onTick(long millisUntilFinished) {
        if (tvCode != null) {
            tvCode.setClickable(false);
            tvCode.setEnabled(false);
            tvCode.setText(millisUntilFinished / 1000 + "s");
            tvCode.setTextColor(Color.parseColor("#999999"));
        }
    }
}.start();

点击按钮,获取验证码成功之后就可以执行以上操作,最后一定要start,不然不会执行

四、使用注意

CountDownTimer使用很简单,但是坑很多,需要注意避免踩坑。

1、空指针:如果在activity或者fragment关闭销毁的时候没有调用cancle方法,它的onTick方法还是会继续执行,这个时候UI控件都为空,不注意判断的话很容易空指针

2、时间不是太准的问题:

    我们看CountDownTimer的源码可以看到,在执行onTick的方法时,google源码里面减去了程序执行到这里的时候所消耗的时间,这里可以看出google代码的严谨

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

if (millisLeft <= 0) {
    onFinish();
} else if (millisLeft < mCountdownInterval) {
    // no tick, just delay until done
    sendMessageDelayed(obtainMessage(MSG), millisLeft);
}

所以一开始倒计时的时间是59,这里可以在构造方法里面稍微加一点时间就可以解决如:

new CountDownTimer(60 * 1000+300, 1000)

3、内存泄漏问题

    首先我们来看源码,核心代码如下

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 if (millisLeft < mCountdownInterval) {
                // no tick, just delay until done
                sendMessageDelayed(obtainMessage(MSG), millisLeft);
            } else {
                long lastTickStart = SystemClock.elapsedRealtime();
                onTick(millisLeft);

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

                // 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的原理还是用到了Handler,所以很容易造成内存泄漏问题,当Activity或者Fragment关闭而倒计时还未结束的时候,会在后台一直执行,而很多时候我们用倒计时会有更新UI的操作,而控件都持有activity的引用,长期得不到释放的话就会造成内存泄漏,甚至会造成1所说的空指针问题,所以一般要在activity或fragment销毁的时候调用cancle方法。

我自己把这个进行了封装,写成了一个工具类以供参考:

public class TimeUtils {
    private String color;//这里可以修改文字颜色
    WeakReference<TextView> tvCodeWr;//控件软引用,防止内存泄漏
    private CountDownTimer timer;


    public TimeUtils(TextView tvCode, String color) {
        super();
        this.tvCodeWr = new WeakReference(tvCode);
        this.color = color;
    }
//这是倒计时执行方法
    public void RunTimer() {
        timer = new CountDownTimer(60 * 1000 - 1, 1000) {
            @Override
            public void onFinish() {
                if (tvCodeWr.get() != null) {
                    tvCodeWr.get().setText("重新获取");
                    tvCodeWr.get().setTextColor(Color.parseColor(color));
                    tvCodeWr.get().setClickable(true);
                    tvCodeWr.get().setEnabled(true);
                }

                cancel();
            }

            @Override
            public void onTick(long millisUntilFinished) {
                if (tvCodeWr.get() != null) {
                    tvCodeWr.get().setClickable(false);
                    tvCodeWr.get().setEnabled(false);
                    tvCodeWr.get().setText(millisUntilFinished / 1000 + "s");
                    tvCodeWr.get().setTextColor(Color.parseColor("#999999"));
                }
            }
        }.start();
    }
//这个方法可以在activity或者fragment销毁的时候调用,防止内存泄漏
    public void cancle() {
        if (timer != null) {
            timer.cancel();
            timer = null;
        }
    }
}

到此这篇关于Android CountDownTimer案例总结的文章就介绍到这了,更多相关Android CountDownTimer内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • ExpandableListView实现手风琴效果

    ExpandableListView实现手风琴效果

    这篇文章主要为大家详细介绍了ExpandableListView实现手风琴效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-08-08
  • 分析CmProcess跨进程通信的实现

    分析CmProcess跨进程通信的实现

    CmProcess是Android一个跨进程通信框架,无需进行bindService()操作,不用定义Service,也不需要定义aidl。 支持IPC级的 Callback,并且支持跨进程的事件总线,可同步获取服务,采用面向接口方式进行服务注册与调用,服务调用方和使用者完全解耦
    2021-06-06
  • android实现简单仪表盘效果

    android实现简单仪表盘效果

    这篇文章主要为大家详细介绍了android实现简单仪表盘效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-05-05
  • Android笔记之:onConfigurationChanged详解

    Android笔记之:onConfigurationChanged详解

    本篇是对Android中onConfigurationChanged的使用进行了详细的分析介绍。需要的朋友参考下
    2013-05-05
  • Android实现收到新短信后自动发邮件功能

    Android实现收到新短信后自动发邮件功能

    这篇文章主要为大家详细介绍了Android实现收到新短信后自动发邮件功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-05-05
  • Android组件创建DrawerLayout导航

    Android组件创建DrawerLayout导航

    这篇文章主要为大家详细介绍了Android组件创建DrawerLayout导航的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-01-01
  • Android提高之SurfaceView的基本用法实例分析

    Android提高之SurfaceView的基本用法实例分析

    这篇文章主要介绍了Android提高之SurfaceView的基本用法,非常实用的功能,需要的朋友可以参考下
    2014-08-08
  • Android Flutter中Offstage组件的使用教程详解

    Android Flutter中Offstage组件的使用教程详解

    这篇文章主要为大家详细介绍了Android Flutter中Offstage组件的使用教程,文中的示例代码讲解详细,对我们了解Flutter有一定的帮助,需要的可以参考一下
    2023-02-02
  • Android ViewPager的MVP架构搭建过程

    Android ViewPager的MVP架构搭建过程

    本文主要介绍了ViewPager在Android中的作用以及使用场景,如引导页、图片浏览器、新闻或文章内容的多标签页等,同时,还详细阐述了如何通过MVP架构来搭建ViewPager,将视图和逻辑进行解耦,提高代码的可测试性、可复用性,使代码结构更清晰且易于扩展功能
    2024-10-10
  • Android编程之短信窃听器实现方法

    Android编程之短信窃听器实现方法

    这篇文章主要介绍了Android编程之短信窃听器实现方法,以实例形式较为详细的分析了Android编程实现窃听器的具体步骤与实现技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-11-11

最新评论