RxJava操作符——Observable.create
使用
通过Observable.create()方法传入一个Observable.OnSubscribe对象来创建Observable
Observable.create(new Observable.OnSubscribe<String>() {
@Override
public void call(Subscriber<? super String> subscriber) {
subscriber.onNext("野猿新一");
subscriber.onCompleted();
}
}).subscribe(new Action1<String>() {
@Override
public void call(String s) {
Log.d("Himmy", s);
}
});
RxJava的核心就是响应式编程,下面这段示例能让你更好地理解什么是响应式
通过Observable.create()创建了一个Observable,封装了一个按钮的点击事件监听。
当按钮点击的时候调用subscriber.onNext发送事件,这样在Observer的onNext中可以接受处理该事件。
当按钮点击5次后,调用subscriber.onCompleted结束事件的订阅,回调Observer的onCompleted方法,之后再点击按钮该Observer也不会再接收到事件
每当按钮点击一次,事件源Observable就发送一次事件,订阅者Observer就接收到该事件做相关处理,这就是响应式编程
Observable<Integer> observable = Observable.create(new Observable.OnSubscribe<Integer>() {
private int count;
@Override
public void call(final Subscriber<? super Integer> subscriber) {
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
subscriber.onNext(++count);
if (count == 5) {
subscriber.onCompleted();
}
}
});
}
});
observable.subscribe(new Observer<Integer>() {
@Override
public void onNext(Integer integer) {
Log.d("Himmy", "onClick:" + integer);
}
@Override
public void onCompleted() {
Log.d("Himmy", "onCompleted");
}
@Override
public void onError(Throwable e) {
Log.d("Himmy", "onError");
}
});
通过Observable.create你可以创建任何同步的或者异步的事件源。比如说封装一个网络请求、数据库处理、文件读写等。
如下伪代码演示封装一个网络请求创建一个Observable
Observable.create(new Observable.OnSubscribe<UserInfo>() {
@Override
public void call(final Subscriber<? super UserInfo> subscriber) {
HttpClient.getUserInfo(new HttpCallback() {
@Override
public void onSuccess(UserInfo info) {
subscriber.onNext(info);
subscriber.onCompleted();
}
@Override
public void onError(Exception e) {
subscriber.onError(e);
}
});
}
});
源码解析
RxJva现在已经更新到了3.0.0,整个项目的代码量和复杂度都增加不少,为了降低理解难度,本文解析的是RxJava1.0.0的源码,其核心原理是一样的,为了便于理解,会删除源码中一些不相关的代码,或者以伪代码的形式展示
create方法内部其实就是新建一个Observable,参数为用户自己实现的OnSubscribe
public final static <T> Observable<T> create(OnSubscribe<T> f) {
return new Observable<T>(f);
}
传入的OnSubscribe被Observable内部持有,在调用subscribe方法的时候会用到
public class Observable<T> {
final OnSubscribe<T> onSubscribe;
protected Observable(OnSubscribe<T> f) {
this.onSubscribe = f;
}
}
再看Observable.subscribe()方法,里面调用了之前传入的OnSubscribe对象的call()方法,暂且叫这个步骤叫做开启事件源吧。
public final Subscription subscribe(Subscriber<? super T> subscriber) {
try {
// 省略其他代码
onSubscribe.call(subscriber);
// 省略其他代码
return subscriber;
} catch (Throwable e) {
// 省略其他代码
}
}
总结
- 通过Observable.create创建Observable
- create方法需出入一个实现call方法的Observable.OnSubscribe对象
- call方法中通过调用subscriber.onNext来发送事件
- call方法中通过调用subscriber.onCompleted结束事件订阅
- call方法中通过调用subscriber.onError来抛出异常
- onCompleted和onError是互斥的