【RxJava 实践系列】(一)基础知识
【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,并且为每个观察者创建一个新的Observable
Observable<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
创建发射指定范围的整数序列的Observable
7. Interval(间隔)
创建一个按固定时间间隔发射整数序列的Observable(周期)
8. Timer
创建在一个指定的延迟之后发射单个数据的Observable(一次);
一般用于定时任务;