本次hackathon中使用了三个类处理倒计时的问题:
1.Timer/TimerTask
2.CountDownTimer
使用场景,因为Catpel需要在用户设置一个时间之后就算按下home也需要倒计时,所以使用了Service+Timer/TimerTask
核心代码如下:
timer.schedule(new TimerTask() {
@Override
public void run() {
COUNT_DOWN--;
}, 1000, 1000);
}
参数:
第一个1000 指的是延迟1000毫秒之后执行。
第二个1000 指的是每过1000毫秒执行一次。
和Serive结合:
class MyBinder extends Binder {
public void setScheduel(boolean isSet) {
if (isSet == true) {
timer.schedule(new TimerTask() {
@Override
public void run() {
COUNT_DOWN--;
}, 1000, 1000);
}
}
写一个公有方法在Binder中 在需要绑定的活动中
new一个ServiceConnection
对象
private ServiceConnection serviceConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
mybinder = (MyService.Mybinder)iBinder;
myBinder.setScheduel();
}
@Override
public void onServiceDisconnected(ComponentName componentName) {
}
} ;
在需要绑定地方绑定
bindService(intent, serviceConnection, BIND_AUTO_CREATE)
在需要的地方解绑服务就可以。后台倒计时就完成了。
使用CountdownTimer是因为它能够在回调函数中更新UI线程的ui
同时需要注意的是:CountDownTimer(long millisInFuture, long interval);
第一个参数是经过多长时间倒计时结束,第二个参数是间隔的时间.
private void initCountDownTimer(){
CountDownTimer timer = new CountDownTimer(timeMillis*1000+2000,1000) {
@Override
public void onTick(long l) {
toolbar.setTitle(timeMillis+"");
setToolbar(SET_,timeMillis);
timeMillis--;
}
@Override
public void onFinish() {
ViewGroup.LayoutParams params = toolbar.getLayoutParams();
params.width = WindowManager.LayoutParams.MATCH_PARENT;
toolbar.setLayoutParams(params);
toolbar.setBackgroundColor(getResources().getColor(R.color.colorAccent));
}
};
timer.start();
}
SetToolbar()是自己写的一个方法。用于设置toolbar的title显示时间。