rxjava2在间隔和toList之后不调用onSuccess

时间:2017-04-05 06:43:28

标签: rx-java2

以下是我使用的代码示例:

Observable.interval(0, 30, TimeUnit.SECONDS)
            .flatMap(new Function<Long, ObservableSource<Long>>() {
                @Override
                public ObservableSource<Long> apply(@NonNull Long aLong) throws Exception {
                    List<Long> list = new ArrayList<>();
                    list.add(aLong);
                    list.add(aLong);
                    list.add(aLong);
                    list.add(aLong);
                    return Observable.fromIterable(list);
                }
            })
            .filter(new Predicate<Long>() {
                @Override
                public boolean test(@NonNull Long aLong) throws Exception {
                    return true;
                }
            })
            .toList()
            .subscribe(new DisposableSingleObserver<List<Long>>() {
                @Override
                public void onSuccess(@NonNull List<Long> longs) {
                    Log.e("test", "onSuccess");
                }

                @Override
                public void onError(@NonNull Throwable e) {
                    Log.e("test", "onError");
                }
            });

我是rxjava2的新手,我不知道为什么在这种情况下不会调用onSuccess或onError。任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:2)

那是因为你有一个源Observable(interval())发出无数个项目,并且没有让它在流中停止。
toList()必须等到onComplete()才能知道流停止的时间并收集它发送到列表中的所有项目。
换句话说,由于你的Observable有无限的项目,你不能把它收集到List,因为它是有限集合。可观察者将无所作为,因为它将永远等待所有物品。