我试图通过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 }
答案 0 :(得分:6)
subscribe
有重载,通常,人们会习惯subscribe(Consumer)
重载。然后他们使用主题,突然onComplete
也被调用。 RxRelay可以让用户远离自己,而不会考虑subscribe(Consumer)
和subscribe(Observer)
之间的区别。
- 不要将错误/完成事件转发给主题:
醇>
确实,但根据我们对初学者的经验,他们通常不会考虑这个问题,甚至不知道可以考虑的方法。
- 不要暴露主题,让你的方法签名返回一个可观察的。
醇>
如果您需要一种方法将物品发送到主题中,这不起作用。目的是使用主题来执行项目多播,有时来自另一个Observable
。如果您通过Subject
完全控制排放量,那么您应该不要打电话给onComplete
,也不要让任何其他事情做到这一点。
答案 1 :(得分:1)
在某些情况下,您无法控制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);
}