[Android开发] RxJava2之路八
来源:互联网 发布:男士休闲鞋 知乎 编辑:程序博客网 时间:2024/05/16 07:17
一、辅助操作符列表
用于处理Observable的操作符,例如延迟、定时等。
二、辅助操作符
2.1 delay操作符
整体延迟一段指定的时间再发射来自Observable的发射物。就是延迟。
它有6种方法参数:
- delay(Function):
- delay(long delay,TimeUnit unit): 指定延迟多长时间
- delay(long delay,TimeUnit unit,mScheduler scheduler): 指定延迟多长时间并添加调度器
- delay(long delay,TimeUnit unit,boolean delayError): 指定延迟多长时间。delayError参数如果为假 就直接抛出onError,为真就如常延迟执行。
- delay(long delay,TimeUnit unit,mScheduler scheduler,boolean delayError): 指定延迟多长时间并添加调度器,错误通知可以设置是否延迟
- delay(ObservableSource ,Function):
看下面带delayError的栗子:
public void testDelay(){ Observable.create(new ObservableOnSubscribe<String>() { @Override public void subscribe(ObservableEmitter<String> e) throws Exception { for(int i=0; i<=3 ;i++){ if(i == 2){ e.onError(new Throwable("自定义的错误")); }else{ e.onNext(i+""); } } try{ Thread.sleep(1000); }catch (Exception ex){ ex.printStackTrace(); } e.onComplete(); } }) //.delay(3000, TimeUnit.MILLISECONDS) //delayError参数如果为假就直接抛出onError,为真就如常延迟执行 .delay(3000,TimeUnit.MILLISECONDS,false) .subscribe(new Consumer<String>() { @Override public void accept(@NonNull String s) throws Exception { Log.e(TAG, "收到消息: " + s); } }, new Consumer<Throwable>() { @Override public void accept(@NonNull Throwable throwable) throws Exception { Log.e(TAG, "收到错误: " + throwable.toString()); } }); }
输出内容为:
02-21 14:03:02.437 17903-17918/? E/AssistActivity: 收到错误: java.lang.Throwable: 自定义的错误
2.2 delaySubscription操作符
delaySubscription 和 delay的差别就是: delaySubscription只做一件事,延迟订阅,因为订阅了才能发送, 这样子发送的数据还是原来的数据。
2.3 do操作符
do操作符有很多个,但是这个很容易理解,就相当于生命周期,在啥时候调用。
例如doOnNext在onNext的时候回调。
ps: 有三个方法的顺序为: doOnComplete -> doFinally -> doAfterTerminate
栗子:
public void testDo(){ Observable.just("1","2") .doOnNext(new Consumer<String>() { @Override public void accept(@NonNull String s) throws Exception { Log.e(TAG, "doOnNext: " + s); } }) .doAfterNext(new Consumer<String>() { @Override public void accept(@NonNull String s) throws Exception { Log.e(TAG, "doAfterNext: " + s); } }) .doOnComplete(new Action() { @Override public void run() throws Exception { Log.e(TAG, "doOnComplete: "); } }) //订阅之后回调的方法 .doOnSubscribe(new Consumer<Disposable>() { @Override public void accept(@NonNull Disposable disposable) throws Exception { Log.e(TAG, "doOnSubscribe: "); } }) .doAfterTerminate(new Action() { @Override public void run() throws Exception { Log.e(TAG, "doAfterTerminate: "); } }) .doFinally(new Action() { @Override public void run() throws Exception { Log.e(TAG, "doFinally: "); } }) //Observable每发射一个数据的时候就会触发这个回调,不仅包括onNext还包括onError和onCompleted .doOnEach(new Consumer<Notification<String>>() { @Override public void accept(@NonNull Notification<String> stringNotification) throws Exception { Log.e(TAG, "doOnEach: "+(stringNotification.isOnNext()?"onNext":stringNotification.isOnComplete()?"onComplete":"onError")); } }) //订阅后可以进行取消订阅 .doOnLifecycle(new Consumer<Disposable>() { @Override public void accept(@NonNull Disposable disposable) throws Exception { Log.e(TAG, "doOnLifecycle: "+disposable.isDisposed()); //disposable.dispose(); } }, new Action() { @Override public void run() throws Exception { Log.e(TAG, "doOnLifecycle run: "); } }) .subscribe(new Consumer<String>() { @Override public void accept(@NonNull String s) throws Exception { Log.e(TAG, "收到消息: " + s); } }); }
输出结果为:
02-21 14:55:10.329 22869-22869/cn.com.minstone.rxjavalearn E/AssistActivity: doOnSubscribe: 02-21 14:55:10.329 22869-22869/cn.com.minstone.rxjavalearn E/AssistActivity: doOnLifecycle: false02-21 14:55:10.329 22869-22869/cn.com.minstone.rxjavalearn E/AssistActivity: doOnNext: 102-21 14:55:10.329 22869-22869/cn.com.minstone.rxjavalearn E/AssistActivity: doOnEach: onNext02-21 14:55:10.329 22869-22869/cn.com.minstone.rxjavalearn E/AssistActivity: 收到消息: 102-21 14:55:10.329 22869-22869/cn.com.minstone.rxjavalearn E/AssistActivity: doAfterNext: 102-21 14:55:10.329 22869-22869/cn.com.minstone.rxjavalearn E/AssistActivity: doOnNext: 202-21 14:55:10.329 22869-22869/cn.com.minstone.rxjavalearn E/AssistActivity: doOnEach: onNext02-21 14:55:10.329 22869-22869/cn.com.minstone.rxjavalearn E/AssistActivity: 收到消息: 202-21 14:55:10.329 22869-22869/cn.com.minstone.rxjavalearn E/AssistActivity: doAfterNext: 202-21 14:55:10.329 22869-22869/cn.com.minstone.rxjavalearn E/AssistActivity: doOnComplete: 02-21 14:55:10.329 22869-22869/cn.com.minstone.rxjavalearn E/AssistActivity: doOnEach: onComplete02-21 14:55:10.329 22869-22869/cn.com.minstone.rxjavalearn E/AssistActivity: doFinally: 02-21 14:55:10.329 22869-22869/cn.com.minstone.rxjavalearn E/AssistActivity: doAfterTerminate:
2.4 materialize操作符
materialize把 被观察者Observable转换为Notification通知对象。dematerialize相反了。 注意用了materialize之后,onNext会回调多了一个数据,因为onComplete也回调到这里了。
ps: 在Rxjava1中Notification有一个getKind的方法的,到了Rxjava2 就没了。。。
public void testMaterialize(){ Observable.just("1","2") .materialize() .subscribe(new Consumer<Notification<String>>() { @Override public void accept(@NonNull Notification<String> stringNotification) throws Exception { //这时候的数据就是一个Notification对象了 Log.e(TAG, (stringNotification.isOnNext()?"onNext":stringNotification.isOnComplete()?"onComplete":"onError")+": "+stringNotification.getValue()); } }); }
输出为:
02-21 15:05:51.424 24043-24043/cn.com.minstone.rxjavalearn E/AssistActivity: onNext: 102-21 15:05:51.424 24043-24043/cn.com.minstone.rxjavalearn E/AssistActivity: onNext: 202-21 15:05:51.424 24043-24043/cn.com.minstone.rxjavalearn E/AssistActivity: onComplete: null
2.5 TimeInterval操作符
获取数据发送的时间间隔,就是把数据转换为数据发送的间隔Timed。
有4个参数方法:
- timeInterval(): 转换为时间Timed,默认时间单位为毫秒
- timeInterval(Scheduler): 转换为时间Timed,可以设置调度器
- timeInterval(TimeUnit): 转换为时间Timed,可以设置时间单位
- timeInterval(TimeUnit,Scheduler): 转换为时间Timed,可以设置时间单位和调度器
栗子
public void testTimeInterval(){ Observable.create(new ObservableOnSubscribe<String>() { @Override public void subscribe(ObservableEmitter<String> e) throws Exception { for(int i=0; i<3; i++){ e.onNext(i+""); Thread.sleep(1000); } e.onComplete(); } }) .subscribeOn(Schedulers.newThread()) .timeInterval() .subscribe(new Consumer<Timed<String>>() { @Override public void accept(@NonNull Timed<String> stringTimed) throws Exception { Log.e(TAG, "accept: "+stringTimed.time()); } }); }
输出为:
02-21 15:50:44.642 28021-28286/cn.com.minstone.rxjavalearn E/AssistActivity: accept: 3202-21 15:50:45.643 28021-28286/cn.com.minstone.rxjavalearn E/AssistActivity: accept: 100002-21 15:50:46.644 28021-28286/cn.com.minstone.rxjavalearn E/AssistActivity: accept: 1002
2.6 timestamp操作符
给发射的每个数据添加时间,转换了为Timed,和timeInterval的参数一致,但是timestamp获取到的time是时间戳,需要自己转换。
public void testTimeStamp(){ Observable.just("a","b") .timestamp() .subscribe(new Consumer<Timed<String>>() { @Override public void accept(@NonNull Timed<String> stringTimed) throws Exception { //转换时间 String date = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss", Locale.CHINA) .format(new Date(stringTimed.time())); Log.e(TAG, "accept: "+date); } }); }
输出结果为:
02-21 16:05:09.956 10120-10120/? E/AssistActivity: accept: 2017-02-21 04:05:0902-21 16:05:09.956 10120-10120/? E/AssistActivity: accept: 2017-02-21 04:05:09
2.7 ObserveOn/SubscribeOn操作符
这两个是切换线程用 的,在线程调度器的时候说了:
http://blog.csdn.net/niubitianping/article/details/54952827
- [Android开发] RxJava2之路八
- [Android开发] Rxjava2之路: Rxbinding2(支持基于Rxjava2)
- [Android开发] RxJava2之路六
- [Android开发] RxJava2之路七
- [Android开发] RxJava2之路九
- [Android开发] RxJava2之路十
- [Android开发] RxJava2之路一 - 观察者模式
- [Android开发] RxJava2之路二 - 基本使用方法
- [Android开发] RxJava2之路十三-阻塞操作例子Demo
- RxJava2.0之Android
- [Android开发] RxJava2之路三 - 调度器Scheduler与线程控制
- [Android开发] RxJava2之路四 - 操作符简介与变换操作符例子Demo
- [Android开发] RxJava2之路五 - 过滤操作符例子Demo
- [Android开发] RxJava2之路十一- 算术和聚合操作符例子Demo
- [Android开发] RxJava2之路十二- 异步和连接操作符例子Demo
- Android开发之路八----UI组件
- Android响应式编程之RxJava2.0
- mars android开发之八:SQLite
- 数据库字段类型和java的对应关系
- Keepalived——配置总结
- unix 环境高级编程2
- eclipse设置背景黑色以及字体大小
- 给进程指定一个新的运行程序的函数exec()
- [Android开发] RxJava2之路八
- OpenGL核心技术之Parallax Mapping
- React Native安卓端项目文件事项
- 我可能是个假程序员
- 虚拟机vmware centos7 扩展磁盘空间
- Spring通过SchedulerFactoryBean实现调度任务的配置
- LeetCode 简单操作 | 17. Letter Combinations of a Phone Number
- awk 结束任务计划
- redisRDB持久化