Android 使用rxjava检索Firebase数据库数据列表
我正在使用firebase创建一个android应用程序。我的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,
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来保持发出项目的顺序