我已经在 android 应用程序中实现了计时器功能,我能够通过调用 timerObject.cancel()
从其他本地方法完成计时器。它工作得很好。
但是当我尝试在特定条件下onTick()
方法中调用相同时,我无法取消计时器,它一直持续到计时器时间结束。
如何取消计时器?
查看源代码CountDownTimer
很容易看出为什么它不起作用。 cancel()
只是从队列中删除用于勾选计时器的消息。但是,在每个即时报价时调用的消息处理程序会在调用 onTick()
后为下一个即时报价发布一条消息。因此,要么您必须在 onTick()
之外调用 cancel()
,例如通过 Handler
,要么切换到使用 Timer 类。
如果使用 RXJava2。 此代码可以为您提供帮助。
public abstract class CountDownTimer {
private TimeUnit timeUnit;
private Long startValue;
private Disposable disposable;
public CountDownTimer(Long startValue,TimeUnit timeUnit) {
this.timeUnit = timeUnit;
this.startValue = startValue;
}
public abstract void onTick(long tickValue);
public abstract void onFinish();
public void start(){
io.reactivex.Observable.zip(
io.reactivex.Observable.range(0, startValue.intValue()), io.reactivex.Observable.interval(1, timeUnit), (integer, aLong) -> {
Long l = startValue-integer;
return l;
}
).subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<Long>() {
@Override
public void onSubscribe(Disposable d) {
disposable = d;
}
@Override
public void onNext(Long aLong) {
onTick(aLong);
}
@Override
public void onError(Throwable e) {
e.printStackTrace();
}
@Override
public void onComplete() {
onFinish();
}
});
}
public void cancel(){
if(disposable!=null) disposable.dispose();
}
}
用:
public class MainActivity extends AppCompatActivity {
@Override protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.start_activity);
new CountDownTimer(10L, TimeUnit.SECONDS) {
@Override
public void onTick(long tickValue) {
Log.d("CountDown", "Remaining: " + tickValue);
// cancel();
}
@Override
public void onFinish() {
Log.d("CountDown", "The End!! ");
}
}.start();
}
}
代码的所有者 https://gist.github.com/chemickypes/fa3b7fc5b5a00a3ce37fee5815018702