Observable.create(...)
испустит Note
, как только createNotWitArtists
вернет значение.Ваша попытка RxJava функционально эквивалентна:
Note emptyNote = createNoteWithArtists(note, artists);
loadNoteResults.NoteLoaded(emptyNote , true);
Взгляните на этот подход:
private Single<User> getUser(String user_uid) {
DatabaseReference db_users = db_root.child("Users");
return Single.create(emitter -> {
db_users.child(each_uid).addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
String uid = dataSnapshot.getKey();
String image = dataSnapshot.child("image").getValue(String.class);
String username = dataSnapshot.child("username").getValue(String.class);
User user = new User(username, null, image, uid);
emitter.onSuccess(user);
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
emitter.onError(databaseError);
}
});
});
}
Идея состоит в том, чтобы использовать Single.create
, который излучает при вызове каждого onDataChange
.
Затем вы можете объединить все Single
с помощью toList()
следующим образом:
// Note note
// List<String> artist
Observable.fromIterable(artistIds) // Observable<String>
.flatMapSingle(this::getUser) // Observable<User>
.toList() // Single<List<User>>
.subscribe( artists -> {
note.setArtists(artists);
loadNoteResults.NoteLoaded(note, true);
});
Кроме того, не забывайте ставить планировщики всякий раз, когда это необходимо.