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不要乱用 会严重影响电池的消耗 具体看官方文档