【问题标题】:Android RX - Observable.timer only firing onceAndroid RX - Observable.timer 只触发一次
【发布时间】:2015-12-08 01:17:25
【问题描述】:

所以我试图创建一个定期触发的可观察对象,但由于某种我无法弄清楚的原因,它只触发一次。谁能看到我做错了什么?

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

【问题讨论】:

    标签: java android rx-android


    【解决方案1】:

    我在我的代码中这样实现,因为它确保任务运行在再次调用之前完成,并且您可以更新延迟。

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

    【讨论】:

      【解决方案2】:

      我知道主题很旧,但可能适合未来的访问者。 (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
                  });
      

      【讨论】:

      • 也许不如使用 Schedulers.computation() 作为计时器。
      【解决方案3】:

      the timer operator 的文档是这样说的:

      创建一个在给定延迟后发出特定项目的 Observable

      因此,您观察到的行为是预期的 - timer() 在延迟后仅发出一个项目。

      另一方面,The interval 运算符将发出以给定间隔间隔开的项目。

      例如,这个 Observable 将每秒发出一个项目:

      Observable.interval(1, TimeUnit.SECONDS);
      

      【讨论】:

      • 这很好,除了我如何防止它发生内存泄漏。
      • @ldrrp 是什么让你认为这会泄露任何东西
      • 有一个非常小的泄漏,我设法在不同的 android 版本/模拟器/设备上多次绘制图表而没有失败。在 github 上的开发人员拒绝确认这个问题之后,我转向了其他事情。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-07-23
      • 2021-03-22
      • 2015-09-07
      • 2016-11-10
      • 2016-01-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多