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 ()
- 方法1
cancel()
: 取消当前的任务 - 方法2
onFinish()
: 当前任务完成的时候回调 - 方法3
onTick(long millisUntilFinished)
: 当前任务每完成一次倒计时间隔时间时回调 - 方法4
start()
: 开始当前的任务
参考链接:
https://www.jianshu.com/p/3c10432a4726
https://juejin.im/entry/59448ffbac502e5490c724aa
网友评论