倒计时、定时器的七种方式,有这篇就够了

倒计时、定时器的使用次数也不少,这篇文章做一个总结,不用每次需要的时候到处去百度了,本文章内的代码都经过本人亲测有效!
注意每次使用定时器的时候在不需要的时候都要及时取消掉,不要让不需要的定时器拖垮应用

方式一:

new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                //十秒之后在这进行操作
            }
        },10000);

方式二:

//View线程实现延迟处理,内部基本与方式一一样,只不过Handler由视图提供
// mView 是我们的控件
  mView.postDelayed(new Runnable() {
      @Override
      public void run() {
        //三秒之后走这里

      }
  },3000);

方式三:

//别忘了 onDestroy() 内进行销毁,防止内存溢出
//第一个参数是总共多长时间,第二个参数是频率时间
        CountDownTimer countDownTimer = new CountDownTimer(10000, 1000){

            @Override
            public void onTick(long millisUntilFinished) {
               //  每刷新一次都走一次这里
               //  millisUntilFinished/1000 这是秒
            }

            @Override
            public void onFinish() {
               //字面意思,倒计时结束时走这里
            }
        };
        countDownTimer.start();//开启刷新
        countDownTimer.cancel();//取消刷新

方式四:

//定时器
        Timer timer = new Timer();
        TimerTask timerTask = new TimerTask() {
            @Override
            public void run() {
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                       //每次刷新再次操作
                    }
                });

            }
        };
        timer.schedule(timerTask,0,1000);//开启刷新,第二个参数是多长时间之后开始倒计时,第三个参数是多长时间进行一次
        timer.cancel();//取消定时器
        

方式五:

    int time = 10;
    Handler mHandler = new Handler();
    Runnable myRunnale = new Runnable() {
        @Override
        public void run() {
            time--;
            if(time>0){
                //每次刷新走这里
               
            }else{
                //倒计时结束走这里
            }
        }
    };
    mHandler.post(myRunnale);//开始倒计时
    mHandler.postDelayed(myRunnale,1000); //延迟倒计时
    mHandler.removeCallbacks(myRunnale); //移除倒计时

方式六:

使用 rxjava

首先导入依赖

implementation 'io.reactivex.rxjava3:rxjava:3.0.4'     

使用

    //定时器
    private var mVideoDuration: Disposable? = null
    clearData()
    //第一个参数是多长时间开始,第二个参数是间隔时间,第三个参数是单位,可以是秒,分钟,小时,天
    mVideoDuration = ObservableTake.interval(0, 1, TimeUnit.SECONDS)
          .observeOn(AndroidSchedulers.mainThread())
          .subscribe({
                 //每次倒计时走这里   
             }, {})
    
    /**
     * 清除定时器*/
    fun clearData() {
        if (mVideoDuration != null) {
            mVideoDuration!!.dispose()
        }
    }     

方式七(不推荐):

int stopTime = 10;
new Thread(new Runnable() {
            @Override
            public void run() {
                while(true){
                    if (stopTime > 0){
                        //主线程操作数据
                        runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                //每次刷新走这里
                            }
                        });
                        stopTime--;
                    }else {
                        //倒计时操作
                    }
                    try{
                        Thread.sleep(1000);
                    }catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }
        }).start();

最后赠送一个双击退出的代码:

private Long finishTime  = 0L
if (System.currentTimeMillis() - finishTime > 1500) {
           Toast.makeText(getBaseContext(),"再按一次退出程序",Toast.LENGTH_SHORT).show();
           finishTime = System.currentTimeMillis();
    } else {
           Toast.makeText(getBaseContext(),"我退出了",Toast.LENGTH_SHORT).show();
    }
  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值