1 RxJava的基本用法
最简单的RxJava用法如下,上游可以是一个Single,也可以是一个Observal,最下游是SingleObserver,也可以是Observer。链的中间是各个节点,它们是下游的上游,也是上游的下游。它们可以实现各种功能,包括线程切换,数据转换等。
Single.just("123")
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new SingleObserver<String>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onSuccess(String value) {
}
@Override
public void onError(Throwable e) {
}
});
2 RxJava的源码结构分析
这里用Single作为上游,因为它的代码逻辑是最简单的。首先,看一下它的subscribe()方法。源码如下。
public final void subscribe(SingleObserver<? super T> subscriber) {
ObjectHelper.requireNonNull(subscriber, "subscriber is null");
subscriber = RxJavaPlugins.onSubscribe(this, subscriber);
ObjectHelper.requireNonNull(subscriber, "subscriber returned by the RxJavaPlugins hook is null");
try {
subscribeActual(subscriber);
} catch (NullPointerException ex) {
throw ex;
} catch (Throwable ex) {
Exceptions.throwIfFatal(ex);
NullPointerException npe = new NullPointerException("subscribeActual failed");
npe.initCause(ex);
throw npe;
}
}
前面三行都是做一些判断,不会影响主要的逻辑,最重要的是 subscribeActual(subscriber)这个方法,我们看一下里面的实现,发现是个抽象方法,记住这里有个叫subscribeActual()的抽象方法,它应该会不用的类重写,实现不同的逻辑。
protected abstract void subscribeActual(SingleObserver<? super T> observer);
再看一下just()的源码,其中RxJavaPlugins.onAssembly()也是个钩子函数,所以我们只需要看new SingleJust<T>(item)里面的逻辑,发现里面只有一个方法,就是上面提到的subscribeActual()。看一下具体的逻辑,它是调用了下游的onSubscribe()和onSuccess()。什么意思呢,就是你上游用just发射了"123",下游就会依次调用onSubscribe()和onSuccess(),并且把你just传入的参数直接传入到下游中。
@Override
protected void subscribeActual(SingleObserver<? super T> s) {
s.onSubscribe(Disposables.disposed());
s.onSuccess(value);
}
@SchedulerSupport(SchedulerSupport.NONE)
public static <T> Single<T> just(final T item) {
ObjectHelper.requir