RxJava:如何向订阅者发送一些额外信息

时间:2017-01-15 11:07:15

标签: java android rx-java

我创建了一个简单的方法,它将消息(作为Object)发送给给定的主题。在另一端,订户将使用该对象。

我将为多个消费者使用相同的主题,因此发送消息时想要发送一些额外的信息,即200,300。因此,消费者可以过滤掉不相关的消息。但不知何故无法弄清楚如何做到这一点。

其他信息(int参数)可以postToSubject方法和action1处理,但不知道如何将其放在subject.onNext(object)

请建议您是否可以考虑任何解决方案。

public void postToSubject(Object object, Subject subject) {
    Observable<Object> observable = Observable.create(new Observable.OnSubscribe<Object>() {
        @Override
        public void call(Subscriber<? super Object> subscriber) {
            subscriber.onNext(object);
            subscriber.onCompleted();
        }
    });
    observable.subscribe(new Action1() {
        @Override
        public void call(Object object) {
            subject.onNext(object);
        }
    });
}

上面的方法如下调用(来自Android Activity,目标是将项目发送到主题。主题将由方法中的第二个参数返回)

Method call

在另一个Android组件类(继承自Linear Layout)时,此消息将被消耗如下。如果我可以得到额外的信息,即200,300,我将过滤掉并在其中放入onNext()。这是我能想到解决方案的方式,但是RxJava专家可能会给出一个很好的解决方案。

consume message

答案:

通过onNext()传递的附加信息如下所示,订阅者将使用if (object instanceof Integer)进行检查并将逻辑设置为获取下一个onNext()返回的下一个值

Result

1 个答案:

答案 0 :(得分:0)

首先,我不会将Object用作参数/消息类型,因为它太通用了。制作一些基类,比如说Item,带有基本信息。

其次,创建Item的子类,比如MenuItemButtonItemParametrizedItem,等等。每个子类型都可以携带其他信息。

第三,postToSubject()应该是这样的:

public void postToSubject(Item object, Subject<Item> subject) {
    subject.onNext(object);
}

(不需要Observable.create ...)

第四,在消费者方面使用filter()运营商:

subject
    .filter(i -> i instanceof MenuItem)
    .subscribe(menuItemSubscriber);
subject
    .filter(i -> i instanceof ParametrizedItem)
    .subscribe(paramertizedItemSubscriber);

现在每个特定订阅者都知道它将接收哪些子类型项,它可以安全地转换为该子类型,并提取与该子类型相关的其他信息。