我试图通过Jake Warthon了解这个库的目的:https: //github.com/JakeWharton/RxRelay
基本上:除了无法调用onComplete或onError之外的主题.主体以有害的方式处于有状态:当它们收到onComplete或onError时,它们不再可用于移动数据.
我知道,这是一个有效的用例,但上面似乎很容易实现只使用现有的主题.
1.不要向主题转发errors/ completions事件:
`observable.subscribe({ subject.onNext(it) }, { log error / throw exception },{ ... })`
Run Code Online (Sandbox Code Playgroud)
2.不要暴露主题,使你的方法签名返回一个可观察的.
fun(): Observable<> { return subject }
我显然在这里遗漏了一些东西,我很好奇它是什么!
class MyPublishRelay<I> : Consumer<I> {
private val subject: Subject<I> = PublishSubject.create<I>()
override fun accept(intent: I) = subject.onNext(intent)
fun subscribe(): Disposable = subject.subscribe()
fun subscribe(c: Consumer<in I>): Disposable = subject.subscribe(c)
//.. OTHER SUBSCRIBE OVERLOADS
}
Run Code Online (Sandbox Code Playgroud)
subscribe有超载,通常,人们习惯了subscribe(Consumer)过载.然后他们使用主题并且突然onComplete也被调用.RxRelay将用户从自己身上移除,而不考虑subscribe(Consumer)和之间的区别subscribe(Observer).
- 不要将错误/完成事件转发给主题:
实际上,但根据我们对初学者的经验,他们通常不会考虑这个问题,甚至不了解可用的方法.
- 不要暴露主题,使您的方法签名返回一个可观察的.
如果您需要一种方法将项目发送到主题,这不起作用.目的是使用主题来执行项目多播,有时来自另一个Observable.如果你通过它完全控制排放Subject,你应该有不打电话的体面,onComplete也不要让其他任何事情做.
| 归档时间: |
|
| 查看次数: |
3840 次 |
| 最近记录: |