Android 使用rxjava检索Firebase数据库数据列表

Android 使用rxjava检索Firebase数据库数据列表,android,firebase,rx-java,rx-android,Android,Firebase,Rx Java,Rx Android,我正在使用firebase创建一个android应用程序。我的firebase数据库结构如下- Users:{ uid:{ name:Bruno, age: 22, email: bruno@gmail.com, address:... } }, Level_info:{ uid:{ score:70,

我正在使用firebase创建一个android应用程序。我的firebase数据库结构如下-

Users:{
       uid:{
           name:Bruno,
           age: 22,
           email: bruno@gmail.com,
           address:...
           }
       },

Level_info:{
          uid:{
              score:70,
              level:5
              }
           }
在Rxjava之前,我检索所有这样的用户-

   userRef.addValueEventListener(new ValueEventListerner(){
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
 for(Datasnapshot snapshot:dataSnapshot.getChildren())
    {
     User user = snapshot.getValue(User.class);
     userList.add(user);

     //to get score and levels
     /*I can't add nested value event listener directly because of Asynchronous behavior */
     userId.add(user.getId());
    }
    getLevels(userId);
 }

@Override
public void onCancelled(DatabaseError error) {
   //handle errors
 }
});

void getLevels(final ArrayList<String> userid){

        levelRef.addValueEventListener(new ValueEventListener(){
   @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
    for(String id:userid)
     {
       Level level = dataSnapshot.child(id).getValue(Level.class);
      levelList.add(level);
       }
  /** Attch both "userList" and "levelList" to RecyclerView */
        }
  @Override
  public void onCancelled(DatabaseError error) {
   //handle errors
     }
  });
 }
userRef.addValueEventListener(新的ValueEventListener(){
@凌驾
公共void onDataChange(DataSnapshot DataSnapshot){
对于(Datasnapshot快照:Datasnapshot.getChildren())
{
User=snapshot.getValue(User.class);
添加(用户);
//获得分数和等级
/*由于异步行为,我无法直接添加嵌套值事件侦听器*/
添加(user.getId());
}
getLevels(userId);
}
@凌驾
已取消的公共无效(DatabaseError错误){
//处理错误
}
});
void getLevels(最终ArrayList用户ID){
levelRef.addValueEventListener(新的ValueEventListener(){
@凌驾
公共void onDataChange(DataSnapshot DataSnapshot){
for(字符串id:userid)
{
Level-Level=dataSnapshot.child(id).getValue(Level.class);
levelList.add(level);
}
/**将“用户列表”和“级别列表”连接到RecyclerView*/
}
@凌驾
已取消的公共无效(DatabaseError错误){
//处理错误
}
});
}
很好。但是如果有很多嵌套的监听器,它将很难读取。所以我尝试改为RxJava和RxAndroid。像这样-

public Observable<ArrayList<User>> userOb(){
return Observable.create(new 
   ObservableOnSubscribe<ArrayList<User>>() {

  @Override
  public void subscribe(final 
ObservableEmitter<ArrayList<User>> emitter) 
throws Exception {
FirebaseDatabase.getInstance().getReference("Users")
                    .addValueEventListener(new ValueEventListener() {
  @Override
  public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
  ArrayList<UserModel> listUsers;
    for(DataSnapshot snapshot: dataSnapshot.getChildren()){
  User user = snapshot.getValue(User.class);
  listUsers= new ArrayList<>();
  listUsers.add(user);
  emitter.onNext(listUsers);
   }
   emitter.onComplete();
   }

  @Override
  public void onCancelled(@NonNull DatabaseError databaseError) {
    }
   });
   }

 });
}
publicobservable userOb(){
返回可观察的。创建(新)
可观测订阅(){
@凌驾
公开发行(最终版)
可观测发射器(发射器)
抛出异常{
FirebaseDatabase.getInstance().getReference(“用户”)
.addValueEventListener(新的ValueEventListener(){
@凌驾
public void onDataChange(@NonNull DataSnapshot DataSnapshot){
ArrayList列表用户;
对于(DataSnapshot快照:DataSnapshot.getChildren()){
User=snapshot.getValue(User.class);
listUsers=新的ArrayList();
添加(用户);
emitter.onNext(列表用户);
}
emitter.onComplete();
}
@凌驾
已取消的公共void(@NonNull DatabaseError DatabaseError){
}
});
}
});
}
这里我不知道如何使用LevelObservable压缩,因为LevelObservable需要来自UserObservable的用户ID来从
Levels/(uid)/“level\u info”
获取数据。这可能是个愚蠢的问题,但我对RxJava是新手。我想从UserObservable到LevelObservable获取相应的userId。那我该怎么做呢? 对不起,我的英语写作能力不好


Edit:是否有这样的实现方法(因为可能我错过了一些简单的实现方法)。

使用
concatMap
而不是
zip
我同意@bubbles,zip操作符在这里不会产生所需的行为-尝试使用concatMap来保持发出项目的顺序