安卓RX - Observable.timer仅触发一次

37

我正在尝试创建一个可观察对象,定期触发,但是出于某些原因,我无法弄清楚,它只会触发一次。有人能看出我做错了什么吗?

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。

3个回答

59

计时器操作符的文档说:

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

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

另一方面,间隔操作符将以给定的间隔间隔地发出项目。

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

Observable.interval(1, TimeUnit.SECONDS);

这很棒,但我该如何防止它内存泄漏。 - ldrrp
@ldrrp,是什么让你认为这会泄漏任何信息? - Tim
我在不同的Android版本/模拟器/设备上多次成功地捕捉到一个非常小的泄漏,但开发人员在GitHub上拒绝承认这个问题,所以我转而处理其他事情。 - ldrrp

21

我知道这个话题旧了,但或许对于未来的访问者有用。(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
            });

1
或许可以使用 Schedulers.computation() 来代替计时器。 - Peter Chaula

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接