RxJava2总结之Subjects、Single与Completable
来源:互联网 发布:伊斯兰教 知乎 编辑:程序博客网 时间:2024/05/16 11:26
目录
- 目录
- Subjects
- Single与Completable
Subjects
Subject可以看成是一个桥梁或者代理,在某些ReactiveX实现中(如RxJava),它同时充当 了Observer和Observable的角色。因为它是一个Observer,它可以订阅一个或多个 Observable;又因为它是一个Observable,它可以转发它收到(Observe)的数据,也可以发射 新的数据。
对我来说为什么用subjects呢?所有Subject都可以直接发射,不需要 发射器的引用 和 Observable.create()不同
- AsyncSubject:简单的说使用AsyncSubject无论输入多少参数,永远只输出最后一个参数。
但是如果因为发生了错误而终止,AsyncSubject将不会发射任何数据,只是简单的向前传递这个错误通知。
AsyncSubject<Integer> source = AsyncSubject.create(); source.subscribe(o -> System.out.println("1:"+o)); // it will emit only 4 and onComplete source.onNext(1); source.onNext(2); source.onNext(3); <!-- it will emit 4 and onComplete for second observer also. --> source.subscribe(o -> System.out.println("2:"+o)); source.onNext(4); source.onComplete(); 日志: 1:4 2:4
- BehaviorSubject:会发送离订阅最近的上一个值,没有上一个值的时候会发送默认值。
如果原始的Observable因为发生了一个错误而终止,BehaviorSubject将不会发射任何 数据,只是简单的向前传递这个错误通知。
BehaviorSubject<Integer> source = BehaviorSubject.create(); //默认值版本// BehaviorSubject<Integer> source = BehaviorSubject.createDefault(-1); source.subscribe(o -> System.out.println("1:"+o)); // it will get 1, 2, 3, 4 and onComplete source.onNext(1); source.onNext(2); source.onNext(3); <!-- it will emit 3(last emitted), 4 and onComplete for second observer also. --> source.subscribe(o -> System.out.println("2:"+o)); source.onNext(4); source.onComplete(); 日志: 1:1 1:2 1:3 2:3 1:4 2:4
- publishSubject(subject里最常用的):可以说是最正常的Subject,从那里订阅就从那里开始发送数据。
如果原始的Observable因为发生了一个错误而终止,PublishSubject将不会发射任何数据,只 是简单的向前传递这个错误通知。
PublishSubject bs = PublishSubject.create(); bs.subscribe(o -> System.out.println("1:"+o)); bs.onNext(1); bs.onNext(2); bs.subscribe(o -> System.out.println("2:"+o)); bs.onNext(3); bs.onComplete(); bs.subscribe(o -> System.out.println("3:"+o)); 日志: 1:1 1:2 1:3 2:3
- replaySubject: 无论何时订阅,都会将所有历史订阅内容全部发出。
ReplaySubject bs = ReplaySubject.create(); bs.subscribe(o -> System.out.println("1:"+o));// 无论何时订阅都会收到1,2,3 bs.onNext(1); bs.onNext(2); bs.onNext(3); bs.onComplete(); bs.subscribe(o -> System.out.println("2:"+o)); 日志: 1:1 1:2 1:3 2:1 2:2 2:3
Single与Completable
参考: 这里写链接内容
使用场景:其实这个网络请求并不是一个连续事件流,你只会发起一次 Get 请求返回数据并且只收到一个事件。我们都知道这种情况下 onComplete 会紧跟着 onNext 被调用,那为什么不把它们合二为一呢?
- Single:它总是只发射一个值,或者一个错误通知,而不是发射 一系列的值。因此,不同于Observable需要三个方法onNext, onError, onCompleted,订阅Single只需要两 个方法:
Single只会调用这两个方法中的一个,而且只会调用一次,调用了任何一个方法之后,订阅关 系终止。
- onSuccess - Single发射单个的值到这个方法
- onError - 如果无法发射需要的值,Single发射一个Throwable对象到这个方法
<!-- retrofit 范例--> public interface APIClient { @GET("my/api/path") Single<MyData> getMyData(); } apiClient.getMyData() .subscribe(new Consumer<MyData>() { @Override public void accept(MyData myData) throws Exception { // handle data fetched successfully and API call completed } }, new Consumer<Throwable>() { @Override public void accept(Throwable throwable) throws Exception{ // handle error event } }); <!-- 单独使用范例: --> Single.just("Amit") .subscribe(s -> System.out.println(s) , throwable -> System.out.println("异常"));
使用场景:通过 PUT 请求更新数据 我只关心 onComplete 事件。使用 Completable 时我们忽略 onNext 事件,只处理 onComplete 和 onError 事件
- Completable:本质上来说和 Observable 与 Single 不一样,因为它不发射数据。
<!-- retrofit 范例-->public interface APIClient { @PUT("my/api/updatepath") Completable updateMyData(@Body MyData data);}apiClient.updateMyData(myUpdatedData) .subscribe(new Action() { @Override public void run() throws Exception { // handle completion } }, new Consumer<Throwable>() { @Override public void accept(Throwable throwable) throws Exception{ // handle error } }); <!-- 单独使用范例: --> Completable.timer(1000, TimeUnit.MILLISECONDS) .subscribe(() -> System.out.println("成功") , throwable -> System.out.println("异常"));
- andThen( Completable中的方法最常用):在这个操作符中你可以传任何Observable、Single、Flowable、Maybe或者其他Completable,它们会在原来的 Completable 结束后执行
apiClient.updateMyData(myUpdatedData) .andThen(performOtherOperation()) // a Single<OtherResult> .subscribe(new Consumer<OtherResult>() { @Override public void accept(OtherResult result) throws Exception { // handle otherResult } }, new Consumer<Throwable>() { @Override public void accept(Throwable throwable) throws Exception{ // handle error } });
阅读全文
1 0
- RxJava2总结之Subjects、Single与Completable
- RxJava中的Single操作符与Subjects
- 理解 RxJava 中的 Single 和 Completable
- RxJava2总结之自定义操作符与实用技巧
- Rxjava2总结之基础认知
- RxJava2总结之操作详解(一)
- RxJava2总结之操作详解(二)
- RxJava2总结之操作详解(三)
- 从零开始的RxJava之旅(4)---- RxJava2总结
- RxJava2.0学习总结
- Rxjava2.x 封装总结
- RxJava2.0之Android
- 使用Subjects
- rxjava2 与 retrofit 网络请求
- 小试牛刀RxJava2之首页检查
- RxJava2操作符之“Delay”
- Rxjava2之rxandroid基本用法
- Rxjava2
- ARVR编辑器V1.2.4曝光,原来好作品都是在这诞生的!
- kettle6.0基础功能实战
- 【转】MB51搜索字段的设置
- python编程从入门到实践 习题11-3
- HDU 6143 Killer Names 组合数+(容斥/第二类Stirling数)
- RxJava2总结之Subjects、Single与Completable
- Android之使用ListView
- 单例模式的4种实现方式
- HDU 4902 NICE BOAT (线段树+懒标记)
- RecyclerView的基本用法
- java 实现proxool oracle数据库连接池的使用
- [HDU P6114]Chess
- json 字符串类型两种转换
- Ubuntu安装Python3.5