【问题标题】:Best way to repeat an observable every minute rxjava每分钟重复一次可观察的最佳方法 rxjava
【发布时间】:2023-03-13 01:07:01
【问题描述】:

我有以下方法:

public class ParentalControlInteractor {
   public Single<Boolean> isPinSet() {
       return bamSdk.getPinManager().isPINSet();
   }
}

我想调用这个函数运行一次,然后每分钟重复一次,直到无穷大,但这似乎很笨拙:

    parentalControlInteractor.isPinSet()
            .subscribeOn(Schedulers.io())
            .repeat(10000)
            .timeout(1600,TimeUnit.MILLISECONDS)
            .doOnError(throwable -> {
                Timber.e(throwable,"Error getting if Pin is set");
                throwable.printStackTrace();
            })
            .subscribe(isPinSet -> {
                this.isPinSet = isPinSet;
                Timber.d("Pin is set = " + isPinSet.toString());
                });

难道没有更好的方法吗?我正在使用 RxJava2。另外,上面的方法只调用了 10000 次。我想永远调用它,比如使用 Handler.postDelayed()。

【问题讨论】:

  • 只需调用repeat() 不传递任何参数即可永久重复
  • 我不希望它每秒都调用这个,我希望有一个间隔。

标签: android rx-java2 repeat


【解决方案1】:

你可以使用interval() oberator 这里是代码

DisposableObserver<Boolean> disposable = 
Observable.interval(1, TimeUnit.MINUTES)
            .flatMap(aLong -> isPinSet().toObservable())
            .subscribeOn(Schedulers.io())
            .subscribeWith({isPinSet -> doSomething()}, {throwable -> handleError()}, {});

如果您想随时完成此操作,请致电disposable.dispose()

【讨论】:

    【解决方案2】:

    试试 .repeatWhen(objectFlowable -&gt; Flowable.timer(10, TimeUnit.SECONDS).repeat())

    【讨论】:

      【解决方案3】:

      试试这个:

      parentalControlInteractor.isPinSet()
              .subscribeOn(Schedulers.io())
              .repeatWhen(new Func1<Observable<? extends Void>, Observable<?>>() {
                  @Override
                  public Observable<?> call(Observable<? extends Void> observable) {
                      return observable.delay(60, TimeUnit.SECONDS);
                  }
              })
              .doOnError(throwable -> {
                  Timber.e(throwable,"Error getting if Pin is set");
                  throwable.printStackTrace();
              })
              .subscribe(isPinSet -> {
                  this.isPinSet = isPinSet;
                  Timber.d("Pin is set = " + isPinSet.toString());
              });
      

      【讨论】:

      • 我遇到了异常。
      • 我不确定@KristyWelsh 指的是什么异常,但这种方法似乎工作正常。
      【解决方案4】:

      事实证明这是在做这项工作:

      parentalControlInteractor.isPinSet()
                  .subscribeOn(Schedulers.io())
                  .delay(10000,TimeUnit.MILLISECONDS)
                  .repeat()
                  .doOnError(throwable -> {
                      Timber.e(throwable,"Error getting if Pin is set");
                      throwable.printStackTrace();
                  })
                  .subscribe(isPinSet -> {
                      this.isPinSet = isPinSet;
                      Timber.d("Pin is set = " + isPinSet.toString());
                      });
      

      【讨论】:

      • 这是第一次运行还是第一次也会延迟?
      • 我相信第一次会延迟。
      • 如何停止进程?
      • 这只会延迟结果10秒,不会重复,请查看我的答案
      【解决方案5】:

      每次都有特定的首次发射延迟重复请求的最佳方式

       return Observable.interval(FIRST_ITEM_DELAY, CYCLE_TIME, TimeUnit.SECONDS)
                             .flatMap(aLong -> repository.repeatedRequest());
      

      【讨论】:

        【解决方案6】:

        你可以组合一些 RxJava 操作符:

        Observable.wrap(parentalControlInteractor.isPinSet().delay(1,TimeUnit.MINUTES)).repeat();
        

        我发现这个解决方案非常优雅且非常简单

        【讨论】:

          猜你喜欢
          • 2017-12-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-12-15
          • 2023-03-23
          • 2015-11-27
          • 1970-01-01
          相关资源
          最近更新 更多