Android 如何将Firebase实时数据库回调与RxJava2结合起来

Android 如何将Firebase实时数据库回调与RxJava2结合起来,android,firebase,firebase-realtime-database,rx-java2,Android,Firebase,Firebase Realtime Database,Rx Java2,我当前的Android项目在Firebase实时数据库中保存着不同类型的参考数据 Android应用程序拥有自己的参考数据本地副本,该副本必须根据上次更新的日期进行刷新 我希望使用RxJava来控制并行刷新此参考数据 成功刷新所有参考数据后,我希望将上次本地更新的日期重置为今天的日期 我目前使用的解决方案没有达到预期效果。我无法重置上次更新的日期,以等待成功刷新参考数据 我的代码目前类似于:- Observable.just(Boolean.TRUE) .subs

我当前的Android项目在Firebase实时数据库中保存着不同类型的参考数据

Android应用程序拥有自己的参考数据本地副本,该副本必须根据上次更新的日期进行刷新

我希望使用RxJava来控制并行刷新此参考数据

成功刷新所有参考数据后,我希望将上次本地更新的日期重置为今天的日期

我目前使用的解决方案没有达到预期效果。我无法重置上次更新的日期,以等待成功刷新参考数据

我的代码目前类似于:-

    Observable.just(Boolean.TRUE)
            .subscribeOn(Schedulers.io())
            .observeOn(Schedulers.io())
            .doOnNext(refresh -> referenceTypeA())
            .doOnNext(refresh -> referenceTypeB())
            .doOnNext(refresh -> referenceTypeC())
            .doOnNext(refresh -> recordTodaysDate())
            .subscribe();
每个referenceTypeX方法的结构如下所示:-

private void referenceTypeX() {

        firebaseService
                .getReferenceTypeX()
                .doAfterSuccess(this::referenceTypeX)
                .doOnError(this::processError)
                .subscribe();
    }


public Single<List<ReferenceTypeX>> getReferenceTypeX() {
    return Single.create(emitter ->
            mReferenceTypeXDatabaseReference
                    .orderByChild("typeXKey")
                    .addValueEventListener(buildTypeXListener(emitter)));
}
public class TypeXListener extends BaseValueEventListener<List<ReferenceTypeX>> {
    private static final TypeXMapper TYPE_X_MAPPER = Selma.builder(TypeXMapper.class).build();
    private static final List<ReferenceTypeX> TYPE_X = new ArrayList<>();

    public TypeXListener(final SingleEmitter<List<ReferenceTypeX>> emitter) {
        super(emitter);
    }

    @Override
    public void onDataChange(final DataSnapshot dataSnapshot) {
        final GenericTypeIndicator<TypeXCsv> typeXTypeIndicator = new GenericTypeIndicator<TypeXCsv>() {
        };

        final Thread thread = new Thread(() -> {
            for (final DataSnapshot typeXDataSnapshot : dataSnapshot.getChildren()) {
                final TypeXCsv typeXCsv = typeXDataSnapshot.getValue(typeXDataSnapshot);
                final TypeX typeX = TypeXMapper.mapTypeX(typeXCsv);

                TYPE_X_s.add(typeX);
            }

            emitter.onSuccess(TYPE_X_s);
        });

        thread.start();

    }
}
您需要修改referenceTypeX函数,以便它们不在函数中订阅:

private Single<List<ReferenceTypeX>> referenceTypeX() {
    return firebaseService
            .getReferenceTypeX()
            .doAfterSuccess(this::referenceTypeX)
            .doOnError(this::processError)
            .subscribe(); // <-- remove this, just return
}
然后,您可以通过组合这些函数来构建主要的可观察对象:

Single
    .zip(
        referenceTypeA().subscribeOn(Schedulers.io()),
        referenceTypeB().subscribeOn(Schedulers.io()),
        referenceTypeC().subscribeOn(Schedulers.io()),
        Function3<A,B,C,Result> { combineIntoResult(...) })
    .flatMap(???) // is this necessary?
    .map(recordTodaysDate())
    .subscribe();
Single
    .zip(
        referenceTypeA().subscribeOn(Schedulers.io()),
        referenceTypeB().subscribeOn(Schedulers.io()),
        referenceTypeC().subscribeOn(Schedulers.io()),
        Function3<A,B,C,Result> { combineIntoResult(...) })
    .flatMap(???) // is this necessary?
    .map(recordTodaysDate())
    .subscribe();