代码之家  ›  专栏  ›  技术社区  ›  Robert Lewis

Rx主题不能使用observeOn()运算符

  •  1
  • Robert Lewis  · 技术社区  · 7 年前

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

    .observeOn(AndroidSchedulers.mainThread() Subject 找到一个 Observable . 但根据文件, 主题 继承 observeOn() 方法从

    顺便问一下,假设我能做到这一点,有没有运算符的优先顺序 toSerialized()

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

    androidstudio说“不兼容的类型:必选:io.reactivex.subjects.Subject;发现:io.reactivex.Observable“

    1 回复  |  直到 7 年前
        1
  •  2
  •   Ben P.    7 年前

    这被拒绝,因为Android工作室希望看到 Subject Observable 主题 继承 observeOn() 方法从 班级。

    你说得对 主题 继承此方法,但这不会更改 observeOn 方法;它仍然返回一个 Observable<T>

    让我们看看每个电话。。。

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

    这很好; createDefault() 返回一个 BehaviorSubject<T> ,它是 Subject<T> subject 变量。

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

    toSerialized() 返回一个 主题<T> 行为主体<T> ,那么如果我们的变量声明 BehaviorSubject<String> subject ,这已经打破了。

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

    我们终于分手了。 观察() 返回一个 ,然后 主题 “是一个” ,我们仍然无法再进行赋值,因为我们有一个错误类型的对象。这类似于尝试分配 Object String

    所以,你要么把你的声明改成 Observable<String> subject (以便执行赋值),或者必须将代码分解为赋值和语句:

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