web-dev-qa-db-ja.com

Android RX-Observable.timerは1回だけ起動します

だから私は定期的に発火するオブザーバブルを作成しようとしていますが、私が理解できない何らかの理由で、一度だけ発火します。誰も私が間違っていることを見ることができますか?

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

現在、遅延は2に設定されています

34
James King

タイマー演算子 のドキュメントには次のように書かれています:

所定の遅延後に特定のアイテムを放出するObservableを作成します

したがって、あなたが観察している振る舞いは予想されるものです-timer()は遅延後に単一のアイテムのみを出力します。

一方、 間隔 演算子は、指定された間隔で間隔を空けてアイテムを出力します。

たとえば、このObservableは1秒ごとにアイテムを発行します。

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

トピックは古いが、将来の訪問者向けかもしれません。 (5分カウントダウンタイマー)

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
            });
17
Jack the Ripper

再度呼び出す前にタスクの実行が完了していることを確認し、遅延を更新できるため、コードにこのように実装しました。

 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
1'hafs