android - 从 Firebase 数据库并行检索数据并与 Android 中的 UI 同步

标签 android firebase firebase-realtime-database

我正在尝试在我的应用程序中实现 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(我必须填充列表并初始化用户)。你会怎么做?

我考虑过附加监听器,但似乎我需要大量的监听器。谢谢大家

编辑 这就是 Db 的结构 This is how db is structured

最佳答案

在这样的场景中,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/

相关文章:

android - 如何从 Realm 中的 ChangeListener 获取特定的变化

java - 尝试在 Android 中使用嵌套列表对 Json 进行排序

node.js - 将对象参数传递给 Promise.all

swift - 使用多个查询过滤 firebase

android - 默认 FirebaseApp 未在进程中初始化(错误)

android - 我可以在 appWidget 中使用哪些 View ?

javascript - 为什么使用 Android HTTP 请求触发器多次调用此 Cloud Function?

java - 卸载应用程序时更新服务器上的数据库

android - V/FA : Processing queued up service tasks: 1 followed by V/FA: Inactivity, 与 AppMeasurementService 断开连接

algorithm - Firebase:如何在游戏中匹配对手?