Я создаю приложение android с использованием Firebase. Моя база данных Firebase имеет следующую структуру:
Users:{
uid:{
name:Bruno,
age: 22,
email: bruno@gmail.com,
address:...
}
},
Level_info:{
uid:{
score:70,
level:5
}
}
До Rx java, я получаю всех пользователей вот так:
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
}
});
}
Все идет хорошо. Но если есть много вложенных Слушателей , Это будет трудно читать. Так что я попытался изменить на Rx Java и Rx Android. Как это -
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) {
}
});
}
});
}
Здесь я не знаю, как архивировать с помощью LevelObservable, потому что levelObservable нужен UserId из UserObservable для получения данных из Levels/(uid)/"level_info"
. Может быть, это глупый вопрос, но я новичок в Rx Java. Я хочу получить соответствующий userId из UserObservable в LevelObservable. Так как я могу это сделать? Извините за мой плохой навык письма Engli sh.
Редактировать: Есть ли способы реализовать подобное (потому что, может быть, я упускаю некоторые простые способы реализации).