rxjava2 在间隔和 toList 之后不调用 onSuccess
rxjava2 not call onSuccess after interval and toList
这是我使用的示例代码:
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。感谢任何帮助。
那是因为你有一个源 Observable (interval()
),它发出无限数量的项目,并且没有什么能阻止它顺流而下。
toList()
必须等到 onComplete()
才能知道流何时停止并将它发出的所有项目收集到列表中。
换句话说,由于您的 Observable 具有无限项,因此您无法将其收集到 List 中,因为它是有限集合。 observable 将不执行任何操作,因为它将永远等待所有项目。
这是我使用的示例代码:
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。感谢任何帮助。
那是因为你有一个源 Observable (interval()
),它发出无限数量的项目,并且没有什么能阻止它顺流而下。
toList()
必须等到 onComplete()
才能知道流何时停止并将它发出的所有项目收集到列表中。
换句话说,由于您的 Observable 具有无限项,因此您无法将其收集到 List 中,因为它是有限集合。 observable 将不执行任何操作,因为它将永远等待所有项目。