您的位置:首页 > 编程语言 > Java开发

【RxJava 实践系列】(二)创建观察者与被观察者

2016-11-13 14:00 507 查看
【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(一次);

一般用于定时任务;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: