Наблюдаемый только излучающий первое значение - PullRequest
0 голосов
/ 21 февраля 2019

Я пытаюсь создать заметку, которая возвращает список из запроса в базе данных.проблема заключается в том, что когда я вызываю onNext, чтобы выдать Item, затем 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 Ответ

0 голосов
/ 22 февраля 2019

Как всегда, есть много способов решить проблему.Пожалуйста, проверьте, работает ли этот вариант для вас:

  1. Измените getMessageObservable на простой метод, который получает ссылку, запрашивает и добавляет ChildEventListener слушатель (никакие наблюдаемые объекты не созданы и т. Д.)
  2. Создать PublishSubject<String> myMessages = PublishSubject.create() тема паба, подпишитесь на нее, как вы обычно делаете с наблюдаемыми.В вашей подписке обязательно прослушайте действие onNext (Action1)
  3. В вашем ChilddEventListener impl, обязательно вызовите myMessages.onNext(message), как только поступят новые сообщения

При вышеуказанной настройке, теперь вы будете получать сообщения, приходящие на вашу подписку onNext.Вы можете хранить изменяемый список и добавлять (или добавлять) приходящие сообщения, уведомляя об этом заинтересованные стороны об обновленном списке сообщений.

...