繁体   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