我正在尝试创建一个可观察对象,该对象从Firebase查询返回一个列表。问题是,当我调用onNext发出项目,然后onComplete时,它停止发出在第一个项目之后的项目,而根本不调用onComplete则什么都不发出。是否有正确的方法来完成我要达到的目标?我还是RxJava
的新手,所以请原谅我的无知。在此先感谢您的帮助:)
public Observable<Message> getMessageObservable(String uid) {
currentUser = auth.getCurrentUser();
DatabaseReference db_messages = db_root.child("Messages").child(currentUser.getUid())
.child(uid);
Query messageQuery = db_messages.orderByKey().limitToLast(10);
return Observable.create(emitter -> {
messageQuery.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
String messageText = dataSnapshot.child("message").getValue().toString();
String messageId = dataSnapshot.child("MessageId").getValue().toString();
Boolean seen = dataSnapshot.child("seen").getValue(Boolean.class);
Long timestamp = dataSnapshot.child("timestamp").getValue(long.class);
String fromUser = dataSnapshot.child("from").getValue().toString();
String toUser = dataSnapshot.child("to").getValue().toString();
Message message = new Message(messageText, toUser, messageId, seen, timestamp, null, fromUser);
emitter.onNext(message);
emitter.onComplete();
}
@Override
public void onChildChanged(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
}
@Override
public void onChildRemoved(@NonNull DataSnapshot dataSnapshot) {
}
@Override
public void onChildMoved(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
});
}
@Override
public void getMessages(String userId) {
currentUser = auth.getCurrentUser();
Observable.just(userId)
.flatMap(this::getMessageObservable)
.toList()
.subscribe(messages -> {
chatResults.getMessagesResult(messages);
});
}
答案 0 :(得分:0)
解决问题的方法一如既往。请检查这个是否对您有用:
getMessageObservable
更改为获取引用,查询并添加ChildEventListener
侦听器的简单方法(不创建可观察对象等)PublishSubject<String> myMessages = PublishSubject.create()
酒吧主题,并像通常使用可观察对象一样订阅它。在您的订阅中,请确保收听onNext动作(Action1)ChilddEventListener
中,请确保在收到新消息后立即致电myMessages.onNext(message)
通过上述设置,您现在将收到消息发送到onNext订阅。您可以保留可变列表并追加(或添加)即将到来的消息,从而通知感兴趣的各方重新更新消息列表。