理解RxJava Subject --Publish, Repl

作者: 塞上牧羊空许约 | 来源:发表于2018-05-13 00:31 被阅读76次

    这篇文章将围绕RxJava中的Subject来展开。

    • Publish Subject
    • Replay Subject
    • Behavior Subject
    • Async Subject

    何谓Subject?

    Subject是RxJava中实现既能扮演观察者(Observer)又能作为Observable的一种桥梁或者代理。因其为一个观察者,它可以订阅一个或多个Observable,又因其为一个Observable,他可以重新发射它观察到的值,也可以发射一些新的值。

    我相信:通过例子来学习是最好的方法
    Observable: 假定教授是一个Observable,教授讲解一些课题。
    Observer: 假定学生是一个Observer,学生听教授正在讲解的课题。

    Publish Subject

    它发射源Observable被订阅之后的所有值。
    如果一个学生上课迟到啦,他只想听到他进入教室后的内容。此时Publish是最适合这个场景。
    来看看下面的例子:

    PublishSubject<Integer> source = PublishSubject.create();
    
    //  1, 2, 3, 4 and onComplete
    source.subscribe(getFirstObserver()); 
    
    source.onNext(1);
    source.onNext(2);
    source.onNext(3);
    
    // It will get 4 and onComplete for second observer also.
    source.subscribe(getSecondObserver());
    
    source.onNext(4);
    source.onComplete();
    

    Replay Subject

    他发射源Observable的所有值,无论订阅者何时订阅。

    如果一个学生迟到啦,他想从头听起。此时我们可以使用Replay来实现。
    例子如下:

    ReplaySubject<Integer> source = ReplaySubject.create();
    // It will get 1, 2, 3, 4
    source.subscribe(getFirstObserver()); 
    source.onNext(1);
    source.onNext(2);
    source.onNext(3);
    source.onNext(4);
    source.onComplete();
    // It will also get 1, 2, 3, 4 as we have used replay Subject
    source.subscribe(getSecondObserver());
    

    Behavior Subject

    当观察者订阅时,它发射源Observable最近一次以及后续的所有值。
    比如,一个学生迟到啦,他想听老师最近讲解的内容(不是从头开始),以了解上下文。所以此时我们会使用Behavior
    代码如下:

    BehaviorSubject<Integer> source = BehaviorSubject.create();
    // It will get 1, 2, 3, 4 and onComplete
    source.subscribe(getFirstObserver());
    source.onNext(1);
    source.onNext(2);
    source.onNext(3);
    // It will get 3(last emitted)and 4(subsequent item) and onComplete
    source.subscribe(getSecondObserver());
    source.onNext(4);
    source.onComplete();
    

    Async Subject

    它值发射源Observable的最后一个值,之后Observable便结束啦。
    如果一个学生在任何一个时刻进入教室,而且他只想他听到教授讲解的最后一个内容,之后变下课啦。此时我们会使用Async.
    代码如下:

    AsyncSubject<Integer> source = AsyncSubject.create();
    // It will get only 4 and onComplete
    source.subscribe(getFirstObserver());
    source.onNext(1);
    source.onNext(2);
    source.onNext(3);
    // It will also get only get 4 and onComplete
    source.subscribe(getSecondObserver());
    source.onNext(4);
    source.onComplete();
    

    翻译自:Understanding RxJava Subject — Publish, Replay, Behavior and Async Subject

    相关文章

      网友评论

        本文标题:理解RxJava Subject --Publish, Repl

        本文链接:https://www.haomeiwen.com/subject/edlkdftx.html