web-dev-qa-db-fra.com

Android RX - Observable.timer ne tire qu'une fois

J'essaie donc de créer un observable qui se déclenche régulièrement, mais pour une raison que je n'arrive pas à comprendre, il ne se déclenche qu'une fois. Quelqu'un peut-il voir ce que je fais mal?

Observable<Long> observable = Observable.timer(delay, TimeUnit.SECONDS, Schedulers.io());

        subscription =  observable
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Action1<Long>() {
                    @Override
                    public void call(Long aLong) {
                        searchByStockHelper.requestRemoteSearchByStock();
                    }
                });

actuellement le délai est fixé à 2

30
James King

La documentation pour l'opérateur du minuteur dit ceci:

Créer un observable qui émet un élément particulier après un délai donné

Par conséquent, le comportement que vous observez est attendu: la fonction timer() n'émet qu'un seul élément après un délai.

L’opérateur , d’autre part, émettra des éléments espacés d’un intervalle donné.

Par exemple, cet observable émettra un objet toutes les secondes:

Observable.interval(1, TimeUnit.SECONDS);
48
Tanis.7x

Je sais que le sujet est ancien mais peut-être pour les futurs visiteurs. (5 min compte à rebours)

Disposable timerDisposable = Observable.interval(1,TimeUnit.SECONDS, Schedulers.io())
        .take(300)
        .map(v -> 300 - v)
        .subscribe(
            onNext -> {
                //on every second pass trigger
            },
            onError -> {
                //do on error
            },
            () -> {
                //do on complete
            },
            onSubscribe -> {
                //do once on subscription
            });
14
Jack the Ripper

J'ai implémenté comme ceci dans mon code, car il s'assure que la tâche en cours est terminée avant d'appeler à nouveau, et vous pouvez mettre à jour le retard.

 return Single.timer(5, TimeUnit.SECONDS).flatMap(
        new Function<Long, Single<Object>>() {
          @Override
          public Single<Object> apply(Long aLong) {
            //create single with task to be called repeatedly
            return Single.create();
          }
        })
        .retry(new Predicate<Throwable>() {
          @Override
          public boolean test(Throwable throwable) {
            boolean response = true;
            //implement your logic here and update response to false to stop 
              retry
            return response;
          }
        });
0
fɪəlɪs