Rx java RxJava组合多个可观察对象毕竟完成了

Rx 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

我有一个方法,应该使用多个观测值重新加载DB。毕竟,它应该调用方法setupplaceselectedplace,但只调用一次。每个可观察对象返回不同的对象void、object和listofObject

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应按顺序调用所有可观察对象。