RxJava操作符——just
使用
如下代码,Observable.just()方法创建一个Observable对象
调用subscribe()方法会发出一个包含“野猿新一”内容的事件
通过Action1.call()的回调我们将事件的内容打印出来
Observable.just("野猿新一")
.subscribe(new Action1<String>() {
@Override
public void call(String s) {
Log.d("Himmy", s);
}
});
源码解析
RxJva现在已经更新到了3.0.0,整个项目的代码量和复杂度都增加不少,为了降低理解难度,本文解析的是RxJava1.0.0的源码,其核心原理是一样的
由如下源码可知,just()方法中通过ScalarSynchronousObservable.create创建了一个Observable对象
public final static <T> Observable<T> just(final T value) {
return ScalarSynchronousObservable.create(value);
}
再看下ScalarSynchronousObservable这个类,其实是个Observable的子类,ScalarSynchronousObservable()方法内部其实是通过OnSubscribe来创建Observable
public final class ScalarSynchronousObservable<T> extends Observable<T> {
public static final <T> ScalarSynchronousObservable<T> create(T t) {
return new ScalarSynchronousObservable<T>(t);
}
private final T t;
protected ScalarSynchronousObservable(final T t) {
super(new OnSubscribe<T>() {
@Override
public void call(Subscriber<? super T> s) {
/*
* We don't check isUnsubscribed as it is a significant performance impact in the fast-path use cases.
* See PerfBaseline tests and https://github.com/ReactiveX/RxJava/issues/1383 for more information.
* The assumption here is that when asking for a single item we should emit it and not concern ourselves with
* being unsubscribed already. If the Subscriber unsubscribes at 0, they shouldn't have subscribed, or it will
* filter it out (such as take(0)). This prevents us from paying the price on every subscription.
*/
s.onNext(t);
s.onCompleted();
}
});
this.t = t;
}
public T get() {
return t;
}
}
所以如下两个方法创建的Observable结果是一样的,只是just方法帮我们简化了代码
// 通过Observable.just创建
Observable observable1 = Observable.just("野猿新一");
// 通过Observable.create和OnSubscribe创建
Observable observable2 = Observable.create(new Observable.OnSubscribe<String>() {
@Override
public void call(Subscriber<? super String> subscriber) {
subscriber.onNext("野猿新一");
subscriber.onCompleted();
}
});