簡體   English   中英

可觀察到的僅發射第一值

[英]Observable only emitting first value

我正在嘗試創建一個可觀察的對象,該對象從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);
            });
}

總是有很多方法可以解決問題。 請檢查這是否適合您:

  1. getMessageObservable更改為獲取引用,查詢並添加ChildEventListener偵聽器的簡單方法(不創建可觀察對象等)
  2. 創建PublishSubject<String> myMessages = PublishSubject.create()發布主題,像通常使用可觀察對象一樣訂閱它。 在您的訂閱中,請確保收聽onNext操作(Action1)
  3. 在您的ChilddEventListener ,確保一旦ChilddEventListener ,就調用myMessages.onNext(message)

通過上述設置,您現在將收到消息發送到onNext訂閱。 您可以保留可變列表並添加(或添加)即將到來的消息,從而通知感興趣的各方重新更新消息列表。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM