我已经声明:
Subject<String> mBehaviorSubject = BehaviorSubject.createDefault("default").toSerialized();
似乎工作正常。但是我现在要添加.observeOn(AndroidSchedulers.mainThread()
。这被拒绝,因为Android Studio希望看到Subject
并正在寻找Observable
。但是根据文档,Subject
从observeOn()
类继承了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”
答案 0 :(得分:2)
这被拒绝,因为Android Studio希望看到
Subject
并正在寻找Observable
。但是根据文档,Subject
从observeOn()
类继承了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());