RxJava----使用
来源:互联网 发布:疯情书厍手机版新域名 编辑:程序博客网 时间:2024/05/19 20:41
基本使用
//一个最简单的实现 //一个Observable(被观察者) Observable<String> observable = Observable.create(new Observable.OnSubscribe<String>() { @Override public void call(Subscriber<? super String> subscriber) { subscriber.onNext("Hello RxJava"); subscriber.onCompleted(); } }); //一个Subscriber(订阅者) Subscriber<String> subscriber = new Subscriber<String>() { public void onCompleted() { log("Complete!"); } @Override public void onError(Throwable e) { log(e.getMessage().toString()); } @Override public void onNext(String s) { log(s); } }; //订阅,Observable执行subscribe之后,调用call方法 observable.subscribe(subscriber);
// Outputs: // Hello RxJava // Complete!
操作符
ReactiveX - Operators
创建操作符
过滤操作符
这些操作符用于从Observable发射的数据中进行选择
条件和布尔操作符
算术和聚合操作符
转换操作符
组合操作符
辅助操作符
生命周期
subscribe
Observable.subscribe 有好几个重载函数,每个函数都是某种情况的简化形式。
Subscription subscribe()Subscription subscribe(Action1<? super T> onNext)Subscription subscribe(Action1<? super T> onNext, Action1<java.lang.Throwable> onError)Subscription subscribe(Action1<? super T> onNext, Action1<java.lang.Throwable> onError,Action0 onComplete)Subscription subscribe(Observer<? super T> observer)Subscription subscribe(Subscriber<? super T> subscriber)
- 第一个 subscribe() 函数只是订阅事件,但是不去处理这些事件。
- 带有一个或者多个 Action 参数的,使用这些参数来构造一个 Subscriber 对象。
- 这些参数分别对应 onNext、onError和 onComplete这三种类型的事件,如果没有提供则代表不处理这个类型的事件。
下面的示例演示处理 error 的情况:
Subject<Integer, Integer> s = ReplaySubject.create(); s.subscribe(new Action1<Integer>() { @Override public void call(Integer integer) { log(integer + ""); } }, new Action1<Throwable>() { @Override public void call(Throwable throwable) { log(throwable.getMessage().toString()); } }); s.onNext(0); s.onError(new Exception("Oops"));
结果:
0Oops
如果你不处理 error,则 在发生错误的时候,会抛出 OnErrorNotImplementedException 异常。该异常发生在生产者这边,上面的示例 生产者和消费者位于同一线程,所以你可以直接 try- catch 住,但是在实际应用中,生产者和消费者通常不再同一个线程,所以最好还是提供一个 错误处理函数,否则你不知道错误发生了并导致事件流结束了。
unsubscribe
在事件流结束发射之前,你可以主动停止接收事件。
每个 subscribe()
都会返回一个 Subscription
示例,该示例有两个函数:
boolean isUnsubscribed()void unsubscribe()
只需要调用 unsubscribe 函数就可以停止接收数据了。
Subject<Integer, Integer> values = ReplaySubject.create(); Subscription subscription = values.subscribe(new Action1<Integer>() { @Override public void call(Integer integer) { log(integer + ""); } }, new Action1<Throwable>() { @Override public void call(Throwable throwable) { log(throwable.getMessage().toString()); } }, new Action0() { @Override public void call() { log("Done"); } }); values.onNext(0); values.onNext(1); subscription.unsubscribe(); values.onNext(2);
结果:
01
一个 observer 调用 unsubscribe 取消监听并不妨碍同一个 observable 上的其他 Observer 对象。
同时,RxJava的另外一个好处就是它处理unsubscribing的时候,会停止整个调用链。如果你使用了一串很复杂的操作符,调用unsubscribe将会在他当前执行的地方终止。不需要做任何额外的工作!
Subject<Integer, Integer> values = ReplaySubject.create(); Subscription subscription1 = values.subscribe(new Subscriber<Integer>() { @Override public void onCompleted() { log("Complete!" ); } @Override public void onError(Throwable e) { log("First: "+e.getMessage().toString() ); } @Override public void onNext(Integer integer) { log("First: "+integer); } }); Subscription subscription2 = values.subscribe(new Subscriber<Integer>() { @Override public void onCompleted() { log("Complete!" ); } @Override public void onError(Throwable e) { log("Second: "+e.getMessage().toString() ); } @Override public void onNext(Integer integer) { log("Second: "+integer); } }); values.onNext(0); values.onNext(1); subscription1.unsubscribe(); log("Unsubscribed first" ); values.onNext(2);
结果:
First: 0Second: 0First: 1Second: 1Unsubscribed firstSecond: 2
onError 和 onCompleted
onError 和 onCompleted 意味着结束事件流。
observable 需要遵守该规范,在 onError 或者 onCompleted 发生后就不应该再发射事件了。
Subject<Integer, Integer> values = ReplaySubject.create(); Subscription subscription1 = values.subscribe(new Subscriber<Integer>() { @Override public void onCompleted() { log("Complete!" ); } @Override public void onError(Throwable e) { log("First: "+e.getMessage().toString() ); } @Override public void onNext(Integer integer) { log("First: "+integer); } }); values.onNext(0); values.onNext(1); values.onCompleted(); values.onNext(2);
结果:
First: 0First: 1Complete!
释放资源
Subscription 和其使用的资源绑定在一起。
所以你应该记得释放 Subscription 来释放资源。
使用 Subscriptions 的工厂函数可以把 Subscription 和需要的资源绑定在一起,然后可以使用 unsubscribe 来释放绑定的资源。
Subscription s= Subscriptions.create(new Action0() { @Override public void call() { log("Clean" ); } }); s.unsubscribe();
结果:
Clean
项目源码 GitHub求赞,谢谢!
引用:
RxJava 教程第一部分:入门之 生命周期管理 - 云在千峰
- RxJava----使用
- RxJava使用
- RXjava 使用
- Android RxJava 使用RxJava开发
- RxJava 教程第一部分:为何使用RxJava
- 在安卓上使用RxJava
- 在安卓上使用RxJava
- RxJava使用介绍
- rxJava的使用
- RxJava使用场景小结
- Rxjava使用示例
- RxJava使用场景小结
- RxJava使用总结
- RxJava的使用
- RxJava 的使用入门
- RxJava 的使用入门
- 使用RxJava实现EventBus
- RxJava 使用详解
- Android Studio如何回滚已经commit的代码
- vtk实战(八)—读取.raw文件
- 老罗视频第二季重磅来袭:Android Studio工具讲解
- <OJ_Sicily>N_Queen Problem
- iOS 打包ipa测试包
- RxJava----使用
- javascript 的 继承(六) 之 寄生组合式继承
- android getSystemService()
- javascript 实现继承的几种方式
- Android处理登录页面的调用
- redis API 和 命令学习网站
- h5第一章第四节
- AsyncTask获取数据库数据
- 如何更新linux系统时间