为什么在使用 toList 时没有调用 onNext?
Why is onNext not getting called when using toList?
我在使用 RxJava toList
运算符时遇到 onNext
未被调用的问题。在 toList
被调用之前,一切都完全按照我的预期进行。我读过的东西 here, here and 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);
在调用 toList()
之后你只会得到一个 onNext()
,那是当源 observable 调用 onComplete()
.
时
您看到的行为的原因是 SQLBrite,它会在每次数据更改时向您发送数据。
这意味着它是一个无休止的流,所以它最终永远不会调用 onComplete()。
我在使用 RxJava toList
运算符时遇到 onNext
未被调用的问题。在 toList
被调用之前,一切都完全按照我的预期进行。我读过的东西 here, here and 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);
在调用 toList()
之后你只会得到一个 onNext()
,那是当源 observable 调用 onComplete()
.
您看到的行为的原因是 SQLBrite,它会在每次数据更改时向您发送数据。 这意味着它是一个无休止的流,所以它最终永远不会调用 onComplete()。