RxJava 定时器,永远重复,可以随时重启和停止

RxJava timer that repeats forever, and can be restarted and stopped at anytime

在android中,我使用定时器执行每5秒重复一次并在1秒后以这种方式开始的任务:

    Timer timer = new Timer();
    timer.scheduleAtFixedRate(new TimerTask() {
        @Override
        public void run() {
            // Here is the repeated task
        }
    }, /*Start after*/1000, /*Repeats every*/5000);

    // here i stop the timer
    timer.cancel();

此计时器将重复直到我调用 timer.cancel()

我正在学习带有 RxAndroid 扩展的 RxJava

所以我在网上找到了这个代码,我试了一下,但没有重复:

Observable.timer(3000, TimeUnit.MILLISECONDS)
    .subscribeOn(Schedulers.newThread())
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe(new Action1<Long>() {
        @Override
        public void call(Long aLong) {
             // here is the task that should repeat
        }
    });

那么 RxJava 中 android 计时器的替代方案是什么。

timer 运算符在指定的延迟后发出一个项目然后完成。我认为您正在寻找 interval 运算符。

Subscription subscription = Observable.interval(1000, 5000, TimeUnit.MILLISECONDS)
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(new Action1<Long>() {
                public void call(Long aLong) {
                    // here is the task that should repeat
                }
            });

如果你想停止它,你只需在订阅上调用取消订阅:

subscription.unsubscribe()

调用Observable.repeat()方法重复

Disposable disposable = Observable.timer(3000, TimeUnit.MILLISECONDS)
.subscribeOn(Schedulers.newThread())
.repeat()
.observeOn(AndroidSchedulers.mainThread())
.subscribe();

如果您想停止它,请致电 disposable.dispose()

KOTLIN way

Observable.timer(5000, TimeUnit.MILLISECONDS)
            .repeat() //to perform your task every 5 seconds
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe {
                Log.d("ComingHere", "Inside_Timer")
            }

这是 %100 正确且安全的工作方式:

     //timer variable is in seconds unit
    int timer = 5;
    Disposable disposable = Observable.interval(timer, TimeUnit.SECONDS)
            .map((tick) -> {
                handler.post(() -> {
                    //Enter your CODE here !!!
                });
                return true;
            }).subscribe();

为了阻止它:

if (disposable != null) {
        disposable.dispose();
    }