如何从onTick方法清除CountDownTimer



我已经在 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

最新更新