使用RxJava从异步调用返回值?
好的,我要做的是从firebase收集一个用户uid列表,然后为每个用户获取一个图像url,并将其合并,然后返回一个对象。我遇到的问题是从异步调用返回对象。我试图实现rxjava来实现这一点,但仍然得到空对象。下面我将提供代码和数据库结构,以便您可以看到我试图实现的目标,感谢所有高级人员的帮助 这是数据库结构: 异步调用:使用RxJava从异步调用返回值?,java,android,firebase,asynchronous,rx-java,Java,Android,Firebase,Asynchronous,Rx Java,好的,我要做的是从firebase收集一个用户uid列表,然后为每个用户获取一个图像url,并将其合并,然后返回一个对象。我遇到的问题是从异步调用返回对象。我试图实现rxjava来实现这一点,但仍然得到空对象。下面我将提供代码和数据库结构,以便您可以看到我试图实现的目标,感谢所有高级人员的帮助 这是数据库结构: 异步调用: private Note createNoteWithArtists(Note note, ArrayList<String> user_uids) {
private Note createNoteWithArtists(Note note, ArrayList<String> user_uids) {
DatabaseReference db_users = db_root.child("Users");
ArrayList<User> artists = new ArrayList<>();
Note note = note;
for (String each_uid : user_uids) {
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);
artists.add(user);
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
note.setArtists(artists);
return Note;
}
private Note createNoteWithArtists(Note Note,ArrayList用户\u uids){
DatabaseReference db_users=db_root.child(“用户”);
ArrayList艺术家=新建ArrayList();
注=注;
for(字符串每个\u uid:user\u uid){
db_users.child(每个uid.addListenerForSingleValueEvent(新的ValueEventListener()){
@凌驾
public void onDataChange(@NonNull DataSnapshot DataSnapshot){
字符串uid=dataSnapshot.getKey();
String image=dataSnapshot.child(“image”).getValue(String.class);
字符串username=dataSnapshot.child(“username”).getValue(String.class);
用户=新用户(用户名、null、图像、uid);
添加(用户);
}
@凌驾
已取消的公共void(@NonNull DatabaseError DatabaseError){
}
});
}
注:艺术家(艺术家);
退货单;
}
正在尝试使用RxJava:
io.reactivex.Observable<Note> observable = io.reactivex.Observable.create(subscriber -> {
subscriber.onNext(createNoteWithArtists(note, artists));
subscriber.onComplete();
});
observable.subscribe(note -> loadNoteResults.NoteLoaded(note, true)).dispose();
io.reactivex.Observable-Observable=io.reactivex.Observable.create(订户->{
subscriber.onNext(createNoteWithArtists(note,artists));
subscriber.onComplete();
});
subscribe(note->loadnotesults.noteload(note,true)).dispose();
它返回注释,但嵌套的artists对象仍然为空:/可观察。只要createNotWitArtists
返回值,create(…)
将发出注释。您的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);
}
});
});
}
另外,在需要时,不要忘记放置调度程序。是的,这正是我想要实现的目标!我是Rxjava新手,看到这个实现有助于了解在哪里发生了什么,以及如何使用接收到的信息。多谢各位
// 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);
});