我正在尝试在我的应用程序中实现 firebase 数据库,但我在同时从多个节点检索数据和更新 ui 时遇到问题。 我将所有 Firebase 方法存储在一个单独的类中。 这是从节点检索数据的方法之一的示例。
public static void getTrainerCity(final Trainer trainer) {
dbref.child(USER_CITY).child(trainer.getId()).addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
trainer.setCity(dataSnapshot.getValue(String.class));
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
然后,例如,要获得一名完整的培训师,我会这样做
public static void getTrainer(final boolean isAthlete, final String trainerId, Trainer trainer) {
trainer.setId(trainerId);
getTrainerCity(trainer);
getTrainerName(trainer);
getTrainerAge(trainer);
getTrainerNumber(trainer);
getTrainerEmail(trainer);
getTrainerGym(trainer);
getTrainerPhoto(trainer);
getTrainerStudyDegree(trainer);
getTrainerDescription(trainer);
if(!isAthlete) {
getTrainerAthletes(trainer);
}
}
当我在 UI 中调用此方法时,我无法一次获得整个 Trainer 对象,因为这些方法不在主线程上运行。这意味着培训师不断更新。但是,我只想在设置了与该方法相关的对象的所有字段时通知 UI(我必须填充列表并初始化用户)。你会怎么做?
我考虑过附加监听器,但似乎我需要大量的监听器。谢谢大家
最佳答案
在这样的场景中,RxJava
大放异彩......您可以做的是将 firebase 查询包装在 Observable.create()
中,然后使用类似 RxJava zip
运算符来组合所有查询。另一种方法(尽可能避免)是嵌套所有导致可怕的回调 hell
例如,对于 getTrainerCity
public static Observable<String> getTrainerCity(int trainerId) {
return Observable.create(subscriber -> {
dbref.child(USER_CITY).child(trainerId).addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
String city = dataSnapshot.getValue(String.class);
subscriber.onNext(city);
subscriber.onCompleted();
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
});
}
关于android - 从 Firebase 数据库并行检索数据并与 Android 中的 UI 同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41649257/