我创建了一个简单的方法,它将消息(作为 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,目标是发送项目到主题。主题将由方法中的第二个参数返回)
在另一个 Android Component Class(继承自 Linear Layout )中,这条消息将被消费如下。如果我可以获得其他信息,即 200, 300 ,我将过滤掉并将 onNext() 放入其中。这是我能想到的解决方案,但是 RxJava 专家可能会提供一个很好的解决方案。
答案:
附加信息如下通过 onNext() 传递,订阅者将使用 if (object instanceof Integer)
检查并放置逻辑以获取 next onNext() 返回的下一个值
最佳答案
首先,我不会使用 Object
作为参数/消息类型,因为它太通用了。创建一些基类,比如 Item
,携带基本信息。
其次,创建 Item
的子类,例如 MenuItem
、ButtonItem
、ParametrizedItem
等。每个子类型都可以携带额外的信息。
第三,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);
现在每个特定的订阅者都知道它将接收什么子类型的项目,它可以安全地转换为该子类型,并提取与该子类型相关的附加信息。
关于java - RxJava : How to send some additional info to subscriber,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41660405/