一、写在前面的

在Android应用中几乎都能看到,闪屏页或者欢迎页右上角有一个 “倒计时 + 跳过” 的功能,还有就是获得验证码的倒计时功能,有些人会想到延迟的实现方式,在这里通过实用Android封装好的类 CountDownTimer 就能轻松实现,其内部原理就是通过Handler机制实现的。

二、效果图

(有待添加)

三、CountDownTimer 介绍

1、CountDownTimer 直接 new 出来使用,其构造函数

    public CountDownTimer(long millisInFuture, long countDownInterval) {        mMillisInFuture = millisInFuture;        mCountdownInterval = countDownInterval;    }

参数 - millisInFuture:设置倒计时的总时间(毫秒)

参数 - countDownInterval:设置每次减去的时间(毫秒)

2、方法

public final void cancel ()public abstract void onFinish ()public abstract void onTick (long millisUntilFinished)public final CountDownTimer start ()

cancel() 取消当前任务

 

onFinish() 当前任务完成的时候调用

onTick(long millisUntilFinished) 当前任务每完成一次倒计时间隔时间时回调

start() 开始当前的任务

注:调用时注意start() 方法的调用,要不倒计时是不起作用的。。

四、例子

public class ZpTimerActivity extends Activity {    private CountDownTimer mTimer;    @Override    protected void onCreate(@Nullable Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_timer);        initView();    }    private void initView() {        if (mTimer == null) {            mTimer = new CountDownTimer((long) (5 * 1000), 1000) {                @Override                public void onTick(long millisUntilFinished) {                    if (!ZpTimerActivity.this.isFinishing()) {                        int remainTime = (int) (millisUntilFinished / 1000L);                        Log.e("zpan","======remainTime=====" + remainTime);                    }                }                @Override                public void onFinish() {                    Log.e("zpan","======onFinish=====");                }            };            mTimer.start();        }    }    @Override    protected void onDestroy() {        super.onDestroy();        if (mTimer != null) {            mTimer.cancel();            mTimer = null;        }    }}

Log 打印

12-06 16:31:17.809 20276-20276/com.example.zpdemo E/zpan: ======remainTime=====412-06 16:31:18.811 20276-20276/com.example.zpdemo E/zpan: ======remainTime=====312-06 16:31:19.812 20276-20276/com.example.zpdemo E/zpan: ======remainTime=====212-06 16:31:20.813 20276-20276/com.example.zpdemo E/zpan: ======remainTime=====112-06 16:31:22.769 20276-20276/com.example.zpdemo E/zpan: ======onFinish=====

五、踩过的坑

在某些场景下,CountDownTimer 会导致空指针,也有可能造成内存泄漏。

如果在Activity或者Fragment被回收时并未调用CountDownTimer的cancel()方法结束自己,这个时候CountDownTimer的Handler方法中如果判断到当前的时间未走完,那么会继续调用onTick方法,Activity或者Fragment已经被系统回收,从而里面的变量被设置为Null,同时,CountDownTimer中的Handler方法还在继续执行,这一块空间始终无法被系统回收也就造成了内存泄漏

01、在CountDownTimer的onTick方法中记得对当前对象做判空处理

activity

if(!activity.isFinishing()){        // TODO}

fragment

if(getActivity()!=null){      // TODO}

02、在和Dialog结合使用的时候,在onFinish()方法调用 dismiss()方法让弹框消失,要判断getFragmentManager是否为空

    @Override    public void onFinish() {        if(getFragmentManager()!=null){            dismiss();        }    }

03、在使用CountDownTimer时,在Activity或fragment生命周期结束时,调用timer.cancle()方法

    @Override    protected void onDestroy() {        super.onDestroy();        if (mTimer != null) {            mTimer.cancel();            mTimer = null;        }    }

 

 

 

更多相关文章

  1. Android读写XML(中)
  2. Android获取其他包的Context实例,然后调用它的方法
  3. Android(安卓)中 View 炸裂特效的实现分析 《IT蓝豹》
  4. android DDMS 调试初级及小技巧
  5. 第11章、日期DatePicker与时间TimePicker控件(从零开始学Android)
  6. Android中如何给app widget添加复杂view
  7. Android(安卓)camera2使用
  8. Android(安卓)JetPack学习笔记之ViewModel
  9. android 2.3 ubuntu 下编译环境配置

随机推荐

  1. Android的两种数据存储方式分析(二)
  2. 安装Android(安卓)开发工具
  3. 安装Android(安卓)Studio遇到中文乱码的
  4. 编程实现Android相机Camera设置
  5. [Android设计模式]Android退出应用程序终
  6. Instrumentation学习基础(一)
  7. Android常用布局类整理(一)
  8. android 上 webkit js 扩展之全局本地对
  9. Android与服务器端数据交互
  10. android之路