RxJava Relay vs Subjects

时间:2017-08-05 06:02:14

标签: rx-java2

我试图通过Jake Warthon了解这个库的目的: https://github.com/JakeWharton/RxRelay

  

基本上:主题除了没有能力调用onComplete或   onerror的。受试者是有害的,有害的:当他们收到一个   onComplete或onError它们不再可用于移动数据。

我明白了,它是一个有效的用例,但上述内容似乎很容易实现,仅使用现有主题。

1。不要向主题转发$(document).on('submit','#submit_button',function(){ $('#members_create_campaign_form_countries option').prop('selected',true); }); / errors个事件:

completions

2。不要暴露主题,让您的方法签名返回一个可观察的。

`observable.subscribe({ subject.onNext(it) }, { log error / throw exception },{ ... })`

我显然在这里遗漏了一些东西,我对这是什么非常好奇!

fun(): Observable<> { return subject }

4 个答案:

答案 0 :(得分:6)

subscribe有重载,通常,人们会习惯subscribe(Consumer)重载。然后他们使用主题,突然onComplete也被调用。 RxRelay可以让用户远离自己,而不会考虑subscribe(Consumer)subscribe(Observer)之间的区别。

  
      
  1. 不要将错误/完成事件转发给主题:
  2.   

确实,但根据我们对初学者的经验,他们通常不会考虑这个问题,甚至不知道可以考虑的方法。

  
      
  1. 不要暴露主题,让你的方法签名返回一个可观察的。
  2.   

如果您需要一种方法将物品发送到主题中,这不起作用。目的是使用主题来执行项目多播,有时来自另一个Observable。如果您通过Subject完全控制排放量,那么您应该不要打电话给onComplete,也不要让任何其他事情做到这一点。

答案 1 :(得分:1)

除了@akarnokd answer

在某些情况下,您无法控制Observable内部的数据流,例如,当使用Room Database观察数据库表中的数据更改时。

答案 2 :(得分:0)

对象的开销更大,因为它们必须跟踪和处理 终端事件状态。中继除了订阅之外是无状态的 管理。

-杰克·沃顿

(这是从OP在GitHub上打开的问题开始的,认为这是一个更正确的答案,想在这里“中继”它,以供其他人查看。https://github.com/JakeWharton/RxRelay/issues/30

答案 3 :(得分:-1)

如果您使用主题,则执行subjects.getValue将始终引发有关null安全性的错误。因此,您必须输入“?或!!”即使您知道代码将不会为空,也可以在代码中的所有位置进行操作。

public T getValue() {
    Object o = value.get();
    if (NotificationLite.isComplete(o) || NotificationLite.isError(o)) {
        return null;
    }
    return NotificationLite.getValue(o);
}