【问题标题】:RxJava : How to send some additional info to subscriberRxJava:如何向订阅者发送一些附加信息
【发布时间】:2017-01-16 18:16:24
【问题描述】:

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

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

可以在postToSubject 方法和action1 处理附加信息(int 参数),但不确定如何将其放置在此处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 组件类(继承自线性布局),该消息将被如下消费。如果我能获得更多信息,即 200, 300 ,我将过滤掉并将 onNext() 放入其中。这是我能想到的解决方案,但是 RxJava 专家可能会给出一个很好的解决方案。

答案:

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

【问题讨论】:

  • 不确定你的意思。您能否添加更多代码以帮助我们了解您的意图。如果它没有编译,请不要担心。
  • @Bohemian - 感谢您的格式化和您的兴趣.. 已附上完整的相关代码 1) 方法 2) 方法调用 3) 消耗 .. 如果您需要更多详细信息,请告诉我..仅供参考,这完美地工作,但是由于多个可能的消费者,我需要用额外的参数过滤它

标签: java android rx-java


【解决方案1】:

首先,我不会使用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);

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

【讨论】:

  • 感谢您的好建议,我正在合并到我的代码中。但是似乎我的问题仍然存在.. 在同一个子类中说 MenuItem.. 我需要从众多订阅者中选择一个,为此我需要发送额外的值.. 即 200 和 300.. 有没有办法发送附加值并根据这些值过滤掉..
  • @Girish 您可以过滤任何谓词。例如:.filter(i -&gt; i.getParam() &gt;= 200 &amp;&amp; i.getParam() &lt; 300)。注意我在这里使用 Java 8 lambda 表示法,在早期的 Java 中你应该使用匿名类。
  • 再次感谢,发送了更多关于 onNext() 的附加信息,请参阅问题本身的答案。 MenuItem 没有所有信息,因此必须单独发送附加信息,即 200。你的建议真的很有帮助,让我对 RxJava 有了更多的了解。
猜你喜欢
  • 1970-01-01
  • 2015-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多