Rx java RxJava组合多个可观察对象毕竟完成了
我有一个方法,应该使用多个观测值重新加载DB。毕竟,它应该调用方法setupplaceselectedplace,但只调用一次。每个可观察对象返回不同的对象void、object和listofObjectRx java RxJava组合多个可观察对象毕竟完成了,rx-java,rx-android,Rx Java,Rx Android,我有一个方法,应该使用多个观测值重新加载DB。毕竟,它应该调用方法setupplaceselectedplace,但只调用一次。每个可观察对象返回不同的对象void、object和listofObject private void reloadDatabaseFromRest(final Place selectedPlace, final Event selectedEvent) throws ParseException { Observable.concat(DatabaseMan
private void reloadDatabaseFromRest(final Place selectedPlace, final Event selectedEvent) throws ParseException {
Observable.concat(DatabaseManager.getInstance().clearDatabase(),
mPlaceUseCase.getPlacesListFromRestObservable()
.filter(places -> places != null && !places.isEmpty())
.doOnNext(places -> mPlaceUseCase.savePlacesToRepository(places)),
mPlaceUseCase.saveSelectedPlace(selectedPlace),
mEventUseCase.getEvenListObservableFromRest(selectedPlace.getId())
.doOnNext(eventList -> mEventUseCase.saveEventsToRepository(eventList)),
mEventUseCase.saveSelectedEventObservable(selectedEvent))
.takeLast(1)
.subscribe(o -> mSplashScreenUI.setupPlace(selectedPlace));
}
但这个方法只在最后一个可观察的对象上进行subscribe,而其他方法则没有被调用,对吗?。我试着使用过滤器、zip和生成愚蠢的ifo instanceOf ArrayList子句,但这是错误的方法。有人能帮帮我吗?你可以使用Completable类型。Completable仅通知订阅者流已完成
使用Completable.fromObservable将您需要订阅的每个可观察对象包装到Completable中,然后合并并行使用Completable.merge启动它们,或使用Completable.concat将它们串联起来
注意:确保包装到Completable中的所有可观察对象都将调用onComplete,因此不是无穷无尽的流。您可以使用Completable类型。Completable仅通知订阅者流已完成
使用Completable.fromObservable将您需要订阅的每个可观察对象包装到Completable中,然后合并并行使用Completable.merge启动它们,或使用Completable.concat将它们串联起来
注意:确保您包装到Completable中的所有可观察对象都将调用onComplete,因此不是无穷无尽的流。非常感谢@koperko!它就像一个符咒,这正是我所需要的。 在重写方法的过程中,我注意到第一个Observable发出了6项clearDatabase,所以我将它包装到Completable中,它就工作了! 我没有使用concat,而是使用flatMap:
private void reloadDatabaseFromRest(final Place selectedPlace, final Event selectedEvent) {
Completable.fromObservable(
DatabaseManager.getInstance().clearDatabase()
.flatMap(aVoidDB -> mPlaceUseCase.getPlacesListFromRestObservable().filter(places -> places != null && !places.isEmpty()))
.flatMap(places -> mPlaceUseCase.savePlacesToRepository(places))
.flatMap(aVoidPlace -> mPlaceUseCase.saveSelectedPlace(selectedPlace))
.flatMap(aVoidSelectedPlace -> {
try {
return mEventUseCase.getEvenListObservableFromRest(selectedPlace.getId());
} catch (ParseException e) {
Log.e(TAG, e.getMessage());
return null;
}
})
.filter(eventList -> eventList != null)
.flatMap(eventList -> mEventUseCase.saveEventsToRepository(eventList))
.flatMap(aVoidEvents -> mEventUseCase.saveSelectedEventObservable(selectedEvent)))
.subscribe(() -> {
mSplashScreenUI.setupPlace(selectedPlace);
});
}
非常感谢@koperko!它就像一个符咒,这正是我所需要的。 在重写方法的过程中,我注意到第一个Observable发出了6项clearDatabase,所以我将它包装到Completable中,它就工作了! 我没有使用concat,而是使用flatMap:
private void reloadDatabaseFromRest(final Place selectedPlace, final Event selectedEvent) {
Completable.fromObservable(
DatabaseManager.getInstance().clearDatabase()
.flatMap(aVoidDB -> mPlaceUseCase.getPlacesListFromRestObservable().filter(places -> places != null && !places.isEmpty()))
.flatMap(places -> mPlaceUseCase.savePlacesToRepository(places))
.flatMap(aVoidPlace -> mPlaceUseCase.saveSelectedPlace(selectedPlace))
.flatMap(aVoidSelectedPlace -> {
try {
return mEventUseCase.getEvenListObservableFromRest(selectedPlace.getId());
} catch (ParseException e) {
Log.e(TAG, e.getMessage());
return null;
}
})
.filter(eventList -> eventList != null)
.flatMap(eventList -> mEventUseCase.saveEventsToRepository(eventList))
.flatMap(aVoidEvents -> mEventUseCase.saveSelectedEventObservable(selectedEvent)))
.subscribe(() -> {
mSplashScreenUI.setupPlace(selectedPlace);
});
}
concat应按顺序调用所有可观察对象。concat应按顺序调用所有可观察对象。