接收主体不能使用observeOn()运算符

时间:2018-10-01 14:27:05

标签: android rx-java2

我已经声明:

Subject<String> mBehaviorSubject = BehaviorSubject.createDefault("default").toSerialized();

似乎工作正常。但是我现在要添加.observeOn(AndroidSchedulers.mainThread()。这被拒绝,因为Android Studio希望看到Subject并正在寻找Observable。但是根据文档,SubjectobserveOn()类继承了Observable方法。我该如何工作?

P.S。假设我可以做到,运算符observeOn()toSerialized()的优先顺序是否存在?

更新:这是我要使用的实际完整代码:

Subject<String> stringPublisher; 
...
stringPublisher = BehaviorSubject.createDefault("default").toSerialized().observeOn(AndroidSchedulers.mainThread());

Android Studio说“不兼容的类型:必需:io.reactivex.subjects.Subject;找到:io.reactivex.Observable”

1 个答案:

答案 0 :(得分:2)

  

这被拒绝,因为Android Studio希望看到Subject并正在寻找Observable。但是根据文档,SubjectobserveOn()类继承了Observable方法。

您是正确的,Subject继承了此方法,但这并没有改变observeOn方法的返回类型;它仍然返回Observable<T>。因为您正在尝试分配,所以会中断。

让我们遍历每个电话...

Subject<String> subject = BehaviorSubject.createDefault("default");

这很好; createDefault()返回BehaviorSubject<T>,它是Subject<T>的子类,因此将其值分配给我们的subject变量没有问题。

Subject<String> subject = BehaviorSubject.createDefault("default").toSerialized();

这也很好; toSerialized()返回Subject<T>,因此我们的分配仍然有效。但是请注意,这仍然比BehaviorSubject<T>的“不够具体”,因此,如果我们的变量声明改为BehaviorSubject<String> subject,则该声明已经失效。

Subject<String> subject = BehaviorSubject.createDefault("default")
                                         .toSerialized()
                                         .observeOn(AndroidSchedulers.mainThread());

我们终于在这里休息了。 observeOn()返回一个Observable<T>,尽管Subject是一个Observable,但由于对象类型错误,我们仍然无法进行赋值。这类似于尝试将Object分配给String变量。

因此,您必须将声明更改为Observable<String> subject(以便可以执行分配),或者必须将代码分解为一个分配和一个语句:

Subject<String> subject = BehaviorSubject.createDefault("default").toSerialized();
Observable<String> observable = subject.observeOn(AndroidSchedulers.mainThread());