【RxJava 实践系列】(二)创建观察者与被观察者
2016-11-13 14:00
507 查看
【RxJava 实践系列】(一)基础知识
【RxJava 实践系列】(二)创建观察者与被观察者
【RxJava 实践系列】(三)线程控制 — Scheduler
2. 解除订阅关系
对于一般Observer想要解除订阅关系需要先获取Subscription;
通过Subscription.unsubscribe()来解除订阅。这样做来在一些地方就非常麻烦。对于Subscriber而言可以直接通过Subscriber.unsubscribe();
比如我们不关心onError方法。这个时候我们门已通过闭包的形式创建观察者。
具体的接口有三种
最基本的、也是最常用的创建方式。【RxJava 实践系列】(一)基础知识有,这里就不贴代码。
Defer操作符会一直等待直到有观察者订阅它,然后它使用Observable工厂方法生成一个Observable。它对每个观察者都这样做,因此尽管每个订阅者都以为自己订阅的是同一个Observable,事实上每个订阅者获取的是它们自己的单独的数据序列。
订阅发生时才生成Observable可以确保Observable包含最新的数据。
这三个操作符生成的Observable行为非常特殊和受限。测试的时候很有用,有时候也用于结合其它的Observables,或者作为其它需要Observable的操作符的参数。
一般用于定时任务;
【RxJava 实践系列】(二)创建观察者与被观察者
【RxJava 实践系列】(三)线程控制 — Scheduler
一、创建Observer(观察者)
Observer(观察者)1、创建普通的Observer
前面基础知识已经实现了这种方式、这里还是提一下。Observer<String> observer = new Observer<String>() { @Override public void onCompleted() { //执行结果 Log.v(TAG, "onCompleted "); } @Override public void onError(Throwable e) { //执行错误 Log.v(TAG, "onError: "+e); } @Override public void onNext(String str) { //接受数据 Log.v(TAG, "onNext: "+str); } };
2、 创建Subscriber
Subscriber是实现了 Observer 的抽象类,对 Observer 接口进行了一些扩展,基本用法与创建Observer 一致。Subscriber<String> subscriber = new Subscriber<String>() { @Override public void onStart() { //执行开始(可选) Log.v(TAG, "onStart "); } @Override public void onCompleted() { //执行结果 Log.v(TAG, "onCompleted "); } @Override public void onError(Throwable e) { //执行错误 Log.v(TAG, "onError: "+e); } @Override public void onNext(String str) { //接受数据 Log.v(TAG, "onNext: "+str); } };
Subscriber与Observer主要差别:
1. onStart(): 这是 Subscriber 增加的方法,可以用来进行初始化操作、比如网络请求时显示进度条2. 解除订阅关系
对于一般Observer想要解除订阅关系需要先获取Subscription;
Subscription subscription= Observable.create(...) .subscribe(Observer); subscription.unsubscribe();
通过Subscription.unsubscribe()来解除订阅。这样做来在一些地方就非常麻烦。对于Subscriber而言可以直接通过Subscriber.unsubscribe();
Subscriber<String> subscriber = new Subscriber<String>() {...}; subscriber.unsubscribe();
3、Action1方式创建
在某些情况下,我们不想实现Observer的onCompleted,onError,onNext全部的方法。比如我们不关心onError方法。这个时候我们门已通过闭包的形式创建观察者。
具体的接口有三种
Observable observable = ...; observable.subscribe(Action1 onNext); observable.subscribe(Action1 onNext,Action1<Throwable> onError); observable.subscribe(Action1 onNext,Action1<Throwable> onError,Action0 onCompleted);
//完整代码 Observable observable2 = ...; observable2.subscribe(new Action1() { @Override public void call(Object o) { //等同于实现onNext方法 } }, new Action1<Throwable>() { @Override public void call(Throwable throwable) { //等同于实现onError方法 } }, new Action0() { @Override public void call() { //等同于实现onCompleted方法 } });
二、创建Observable(被观察者)
1. Create
通过调用观察者的方法从头创建一个Observable最基本的、也是最常用的创建方式。【RxJava 实践系列】(一)基础知识有,这里就不贴代码。
2. Defer(延迟)
— 直到有观察者订阅时才创建Observable,并且为每个观察者创建一个新的ObservableObservable<String> defer = Observable.defer(new Func0<Observable<String>>() { @Override public Observable<String> call() { return Observable.create(new Observable.OnSubscribe<String>() { @Override public void call(Subscriber<? super String> subscriber) { Log.v(TAG, "Observable-call: " + this.toString()); subscriber.onNext("test-data"); subscriber.onCompleted(); } }); } });
Defer操作符会一直等待直到有观察者订阅它,然后它使用Observable工厂方法生成一个Observable。它对每个观察者都这样做,因此尽管每个订阅者都以为自己订阅的是同一个Observable,事实上每个订阅者获取的是它们自己的单独的数据序列。
订阅发生时才生成Observable可以确保Observable包含最新的数据。
3.Empty/Never/Throw
- Empty:不发射任何数据但是正常终止的Observable - Never:创建一个不发射数据也不终止的Observable - Throw:创建一个不发射数据以一个错误终止的Observable
这三个操作符生成的Observable行为非常特殊和受限。测试的时候很有用,有时候也用于结合其它的Observables,或者作为其它需要Observable的操作符的参数。
4. From
将传入的数组或 Iterable 拆分成具体对象后,依次发送出来。5. Just
与from类似,将传入的参数依次发送出来。6. Range
创建发射指定范围的整数序列的Observable7. Interval(间隔)
创建一个按固定时间间隔发射整数序列的Observable(周期)8. Timer
创建在一个指定的延迟之后发射单个数据的Observable(一次);一般用于定时任务;
相关文章推荐
- 企业库应用实践系列一:创建第一个自己的Application Block _转http://www.cnblogs.com/lvwuhuijun/articles/1366094.html
- 微软私有云Azure Pack实践系列之三创建虚拟机角色 推荐
- Android RxJava操作符详解系列: 创建操作符
- 企业库应用实践系列二:对象创建原理详解
- Android RxJava操作符详解系列: 创建操作符
- 浅谈RxJava源码解析(观察者),创建(create、from、just),变换(Map、flatMap)、线程调度
- Unity3D实践系列01,创建项目
- 【RxJava 实践系列】(三)线程控制 — Scheduler
- 【RxJava 实践系列】(一)基础知识
- RxJava系列3:RxJava操作符-创建操作符
- 观察者模式实践 rxjava+retrofit
- 企业库应用实践系列五:创建模板引擎Library
- Rxjava--Subscriber创建流程(观察者)
- RxJava系列7(最佳实践)
- Unity3D实践系列10, Canvas画布的创建和使用
- RxJava系列教程之创建篇(二)
- RxJava与RxAndroid 被观察者的创建
- RxJava系列7(最佳实践)
- 企业库应用实践系列四:创建模板引擎框架
- Unity3D实践系列10, Canvas画布的创建和使用