使用RxJava onNext
运算符时,我遇到了toList
未被调用的问题。在toList
被调用之前,一切都与我期望的一模一样。我读过的内容here,here和here似乎表明onCompleted
未被调用的问题,但我还是RxJava的新手,所以我不确定我需要调用它才能使其工作。
最令人困惑的是,我试图从Google's Android Architecture关注的架构似乎没有调用onCompleted
,而且它的工作正常。
Subscription subscription = mDataSource
// Get Observable<List<Location>> from SQLBrite database
.getLocations()
// Convert to Location object
.flatMap(new Func1<List<Location>, Observable<Location>>() {
@Override
public Observable<Location> call(List<Location> locations) {
return Observable.from(locations);
}
})
// Filter here
.filter(new Func1<Location, Boolean>() {
@Override
public Boolean call(Location location) {
return mPreferences.getUsesCustomLocations() || location.getId().length() <= 2;
}
})
// Convert Location object to String
.map(new Func1<Location, String>() {
@Override
public String call(Location location) {
return location.getTitle();
}
})
// Convert to Observable<List<String>, however using toList()
// causes onNext() to never get called
.toList()
.subscribeOn(mSchedulerProvider.computation())
.observeOn(mSchedulerProvider.ui())
.subscribe(new Observer<List<String>>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
e.printStackTrace();
}
@Override
public void onNext(List<String> locations) {
processLocations(locations);
}
});
mSubscriptions.add(subscription);
答案 0 :(得分:1)
调用toList()
后,您只会获得一个onNext()
,即源观察时调用onComplete()
。
您看到的行为的原因是SQLBrite,它会在每次更改时向您发送数据。 这意味着它是一个无休止的流,所以它最终永远不会调用onComplete()。