web-dev-qa-db-fra.com

Minuterie RxJava qui se répète pour toujours et peut être redémarrée et arrêtée à tout moment

Dans Android j'utilise Timer pour exécuter une tâche qui se répète toutes les 5 secondes et démarre après 1 seconde de cette manière:

    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();

cette minuterie se répétera jusqu'à ce que j'appelle timer.cancel()

J'apprends RxJava avec l'extension RxAndroid

J'ai donc trouvé ce code sur Internet, je l'ai essayé et il ne se répète pas:

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
        }
    });

alors quelle est l'alternative pour le Android Timer dans RxJava.

14
MBH

timer L'opérateur émet un élément après un délai spécifié puis se termine. Je pense que vous cherchez l'opérateur 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
                }
            });

si vous voulez l'arrêter, vous appelez simplement se désinscrire sur l'abonnement:

subscription.unsubscribe()
35
csabapap

Appelez la méthode Observable.repeat() pour répéter

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

Si vous voulez l'arrêter, appelez disposable.dispose()

6
Anshuman