【问题标题】:Observable only emitting first valueObservable 只发出第一个值
【发布时间】:2019-02-21 20:38:03
【问题描述】:

我正在尝试创建一个从 firebase 查询返回列表的 observable。问题是当我调用 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);
            });
}

【问题讨论】:

  • 我认为您不能使用该代码返回列表。收到onChildAdded 后,您会立即完成,并且肯定会停止发射。同时,如果不调用 onComplete,您根本无法在订阅中收到您的列表。
  • 我知道,这就是我在问题中所说的,大声笑有没有办法达到预期的结果?
  • 是的。假设您“永远”发出,toList() 无法为您生成列表 - 您需要调用 onComplete,但不像现在那样在每个项目之后调用。
  • 换句话说,您要么在逻辑具有的某些条件下触发 onComplete,要么必须在订阅中收听 onNext(并删除 toList())
  • 如何触发带有条件的 onComplete?我真的尝试了我能想到的一切。我尝试过使用不同的库,阅读过文档,在 Google 上进行了广泛搜索,但我仍然无法弄清楚这个看似简单的任务:/

标签: java android firebase firebase-realtime-database rx-java


【解决方案1】:

解决问题的方法总是很多。请检查这个是否适合您:

  1. getMessageObservable 更改为获取引用、查询和添加ChildEventListener 侦听器的简单方法(未创建可观察对象等)
  2. 创建PublishSubject&lt;String&gt; myMessages = PublishSubject.create() pub 主题,订阅它,就像您通常使用可观察对象一样。在您的订阅中,请务必收听 onNext 操作 (Action1)
  3. 在您的 ChilddEventListener impl 中,确保在收到新消息后致电 myMessages.onNext(message)

通过上述设置,您的 onNext 订阅现在将收到消息。您可以保留可变列表并附加(或前置)即将到来的消息,从而通知相关方重新更新消息列表。

【讨论】:

  • 是的,这行得通!花了我一点时间来弄清楚实现,但我明白了,哈哈。非常感谢,非常感谢所有的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-17
  • 1970-01-01
  • 2016-03-21
  • 1970-01-01
  • 2018-05-16
  • 1970-01-01
相关资源
最近更新 更多