什么是Subject.asObservable有用?

时间:2016-02-02 00:24:46

标签: rx-java

为什么RxJava需要asObservable

从技术上讲,每个主题已经是一个Observable。它的优点是什么,而不仅仅是像

那样
Observable obs = subject;

2 个答案:

答案 0 :(得分:21)

如果您只是将Subject转换为Observable,那么您仍然可以将其作为Subject投反对票:

PublishSubject<String> subject = PublishSubject.create();
subject.subscribe(System.out::println);
Observable<String> observable = subject;
((PublishSubject<String>) observable).onNext("Hello, world!");

Observable.asObservable()实际上并未将类型转换为Observable;它实际上包裹了当前的Observable。这意味着没有人可以访问上游Observable

使用asObservable()的相同代码与ClassCastException崩溃:

PublishSubject<String> subject = PublishSubject.create();
subject.subscribe(System.out::println);
Observable<String> observable = subject.asObservable();
((PublishSubject<String>) observable).onNext("Hello, world!");

这与final修饰符非常相似。有时您不希望代码100%控制所有内容。

答案 1 :(得分:0)

我需要&#34;记住&#34;后续订阅者使用的发射值,因此我使用了BehaviourSubject。我选择返回一个Observable,以便订阅者不会尝试向其发送数据。