1、基本用法

  • CountDownTimer可以在主线程中直接使用,回调的线程也是主线程

    1. CountDownTimer countDownTimer = new CountDownTimer(1000L * 30, 1000L) {
    2. @Override
    3. public void onTick(long millisUntilFinished) {
    4. // your logic for tick
    5. Log.i("TEST", "onTick - " + Thread.currentThread() + ", millisUntilFinished - " + millisUntilFinished);
    6. }
    7. @Override
    8. public void onFinish() {
    9. // your logic for finish
    10. Log.i("TEST", "onFinish" + Thread.currentThread());
    11. }
    12. };
    13. countDownTimer.start();
  • 运行结果

    1. I/TEST: onTick - Thread[main,5,main], millisUntilFinished - 29999
    2. I/TEST: onTick - Thread[main,5,main], millisUntilFinished - 28998
    3. I/TEST: onTick - Thread[main,5,main], millisUntilFinished - 27996
    4. I/TEST: onTick - Thread[main,5,main], millisUntilFinished - 26994
    5. I/TEST: onTick - Thread[main,5,main], millisUntilFinished - 25990
    6. I/TEST: onTick - Thread[main,5,main], millisUntilFinished - 24988
    7. I/TEST: onTick - Thread[main,5,main], millisUntilFinished - 23986
    8. I/TEST: onTick - Thread[main,5,main], millisUntilFinished - 22983
    9. I/TEST: onTick - Thread[main,5,main], millisUntilFinished - 21979
    10. I/TEST: onTick - Thread[main,5,main], millisUntilFinished - 20976
    11. I/TEST: onTick - Thread[main,5,main], millisUntilFinished - 19972
    12. I/TEST: onTick - Thread[main,5,main], millisUntilFinished - 18970
    13. I/TEST: onTick - Thread[main,5,main], millisUntilFinished - 17968
    14. I/TEST: onTick - Thread[main,5,main], millisUntilFinished - 16965
    15. I/TEST: onTick - Thread[main,5,main], millisUntilFinished - 15963
    16. I/TEST: onTick - Thread[main,5,main], millisUntilFinished - 14961
    17. I/TEST: onTick - Thread[main,5,main], millisUntilFinished - 13958
    18. I/TEST: onTick - Thread[main,5,main], millisUntilFinished - 12955
    19. I/TEST: onTick - Thread[main,5,main], millisUntilFinished - 11952
    20. I/TEST: onTick - Thread[main,5,main], millisUntilFinished - 10950
    21. I/TEST: onTick - Thread[main,5,main], millisUntilFinished - 9948
    22. I/TEST: onTick - Thread[main,5,main], millisUntilFinished - 8946
    23. I/TEST: onTick - Thread[main,5,main], millisUntilFinished - 7944
    24. I/TEST: onTick - Thread[main,5,main], millisUntilFinished - 6942
    25. I/TEST: onTick - Thread[main,5,main], millisUntilFinished - 5939
    26. I/TEST: onTick - Thread[main,5,main], millisUntilFinished - 4936
    27. I/TEST: onTick - Thread[main,5,main], millisUntilFinished - 3932
    28. I/TEST: onTick - Thread[main,5,main], millisUntilFinished - 2929
    29. I/TEST: onTick - Thread[main,5,main], millisUntilFinished - 1926
    30. I/TEST: onTick - Thread[main,5,main], millisUntilFinished - 925
    31. I/TEST: onFinishThread[main,5,main]

    2、cancle

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

    1. countDownTimer.cancel();