Android Tip 之倒计时功能

CountDownTimer 使用

系统提供了一个CountDownTimer类用于实现倒计时功能,他是一个抽象类。通常的写法是这样:

      /**把CountDownTimer 声明成全局变量 方便在activity的 onDestroy中取消避免内存泄露(因为它是用handle实现)
     */
    private CountDownTimer mDownTimer;
    private final static long MILLISINFUTURE=1000*60;
    private final static long COUNTDOWNINTERVAL=1000;
    private void startCountDonw(){
        //改变按钮的状态
        mStartBtn.setText((MILLISINFUTURE / 1000) + "秒后重发");
        mStartBtn.setEnabled(false);
        mDownTimer =new CountDownTimer(MILLISINFUTURE,COUNTDOWNINTERVAL) {
            @Override
            public void onTick(long millisUntilFinished){
                mStartBtn.setText((millisUntilFinished/1000)+"秒后重发");
            }
            @Override
            public void onFinish() {
                mStartBtn.setEnabled(true);
                mStartBtn.setText("获取验证码");
            }
        };
        mDownTimer.start();
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
        if(mDownTimer!=null) mDownTimer.cancel();
    }

PowerManager

上面的写法看似没有问题,但是有时候如果我们正在开启倒计时功能,这时候activity被onStop了或者是锁屏状态 cpu进入睡眠在重新onrResume的时候 CountDownTimer 就有可能重新计算时间 导致倒计时不准确,出现bug,解决办法是通过WakeLock 锁定cpu 保持run状态,Example:

  /**把CountDownTimer 声明成全局变量 方便在activity的 onDestroy中取消避免内存泄露
     */
    private CountDownTimer mDownTimer;
    private final static long MILLISINFUTURE=1000*60;
    private final static long COUNTDOWNINTERVAL=1000;
    private void startCountDonw(){
        //改变按钮的状态
        mStartBtn.setText((MILLISINFUTURE / 1000) + "秒后重发");
        mStartBtn.setEnabled(false);
        //获取PM
        PowerManager pm=(PowerManager)getSystemService(Context.POWER_SERVICE);
        // 获取 WakeLock
        mWakeLock=pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,"");
        // 锁定
        mWakeLock.acquire();
        mDownTimer =new CountDownTimer(MILLISINFUTURE,COUNTDOWNINTERVAL) {
            @Override
            public void onTick(long millisUntilFinished){
                mStartBtn.setText((millisUntilFinished/1000)+"秒后重发");
            }
            @Override
            public void onFinish() {
                mStartBtn.setEnabled(true);
                mStartBtn.setText("获取验证码");
                //释放
                if(mWakeLock!=null)mWakeLock.release();
            }
        };
        mDownTimer.start();
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
        if(mWakeLock!=null) mWakeLock.release();
        if(mDownTimer!=null) mDownTimer.cancel();
    }

把代码改成上面的方式就行了注意WakeLock不要乱用 会严重影响电池的消耗 具体看官方文档

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值