gpt4 book ai didi

java - 使用 RxJava 从异步调用返回值?

转载 作者:行者123 更新时间:2023-12-02 10:17:13 25 4
gpt4 key购买 nike

好吧,所以我想做的是从 firebase 收集 user_uid 列表,然后为每个 user_uid 获取一个图像 url 并将其组合并返回一个对象。我遇到的问题是从异步调用返回对象。我正在尝试实现 rxjava 来实现此目的,但我仍然得到空对象。下面我将提供代码和数据库结构,以便您可以看到我想要实现的目标,提前感谢大家的帮助

这是数据库结构: enter image description here

异步调用:

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;
}

尝试使用 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();

它返回注释,但嵌套的艺术家对象仍然为空:/

最佳答案

一旦 createNotWitArtists 返回值,

Observable.create(...) 将发出一个 Note。您的 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);
}
});
});
}

这个想法是使用在调用每个 onDataChange 时发出的 Single.create

然后您可以使用 toList() 组合所有 Single,如下所示:

// 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);
});

此外,不要忘记在需要时放置调度程序。

关于java - 使用 RxJava 从异步调用返回值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54599579/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com