美文网首页
CountDownTimer实现倒计时

CountDownTimer实现倒计时

作者: Ello_Orld | 来源:发表于2018-11-09 11:40 被阅读5次

    android.os 中有一个神奇的类叫 [CountDownTimer]的类,此类神奇之处就在于你完全不需要理会那些线程交互他都给你处理好了,你只管在回调中处理时间设置跳转逻辑就好了。

    典型应用:闪屏页倒计时
    启动闪屏页之后,右上角倒计时 3,2,1 跳转到主界面

    代码

    CountDownTimer timer;
    @Override
    protected void initView() {
        timer = new CountDownTimer(3000, 1000) {
                @Override
                public void onTick(long millisUntilFinished) {
                    long s = millisUntilFinished / 1000;
                    btnSkip.setText(s == 0 ? "跳过" : s +  "s 跳过");
                }
                @Override
                public void onFinish() {
                    toMainActivity();
                }
            }.start();
        }
    
    boolean isIn = false;
    
        @OnClick(R.id.btn_skip)
        void toMainActivity() {
            timer.cancel();
            if (isIn) {
                return;
            }
            isIn = true;
            Intent intent = new Intent(SplashActivity.this, MainActivity.class);
            startActivity(intent);
            overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out);
            finish();
        }
    

    看一下运行效果:


    倒计时.gif

    一个问题是,直接到实际从2s开始的,没有出现最开始的3s
    打印log看一下

    timer = new CountDownTimer(3000, 1000) {
                @Override
                public void onTick(long millisUntilFinished) {
                    Log.d("dxl", "mil : " + millisUntilFinished);
                    long s = millisUntilFinished / 1000;
                    btnSkip.setText(s == 0 ? "跳过" : s +  "s 跳过");
                }
    
                @Override
                public void onFinish() {
                    Log.e("dxl", "finish");
                    toMainActivity();
                }
            }.start();
    
    2018-11-09 11:33:37.552 10404-10404/com.dxl.test D/dxl: mil : 2970
    2018-11-09 11:33:38.553 10404-10404/com.dxl.test D/dxl: mil : 1969
    2018-11-09 11:33:39.555 10404-10404/com.dxl.test D/dxl: mil : 968
    

    第一次开始的时候,时间不是设置的3000了
    2970/1000 = 2 所以第一次是从2s开始了。
    修改一种可以是用double去除,然后四舍五入。或者开始的倒计时时间改为4000.

    参考:
    方法

    public final void cancel ()
    public abstract void onFinish ()
    public abstract void onTick (long millisUntilFinished)
    public final CountDownTimer start ()
    
    • 方法1cancel(): 取消当前的任务
    • 方法2onFinish(): 当前任务完成的时候回调
    • 方法3onTick(long millisUntilFinished): 当前任务每完成一次倒计时间隔时间时回调
    • 方法4start(): 开始当前的任务

    参考链接:
    https://www.jianshu.com/p/3c10432a4726
    https://juejin.im/entry/59448ffbac502e5490c724aa

    相关文章

      网友评论

          本文标题:CountDownTimer实现倒计时

          本文链接:https://www.haomeiwen.com/subject/fxwnxqtx.html