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