Rxjava2中Single的just操作符源码学习

1、最近学习了下Rxjava2中Single的just操作符以及其订阅过程,这里做个学习笔记方便以后查看,Single可以看着是一个简化版的Observable,它的订阅回调可以只有onSubscribe、onSuccess、onError这三个方法,所以Single常被用于网络请求中。下面看下Single的基本使用:

//注释1
Single<Integer> integerSingle = Single.just(1);

//注释2
integerSingle.subscribe(new SingleObserver<Integer>() {
    @Override
    public void onSubscribe(Disposable d) {

    }

    @Override
    public void onSuccess(Integer s) {
        Log.e("znh", "s:" + s);
    }

    @Override
    public void onError(Throwable e) {

    }
});

2、Single的just操作符源码:

@CheckReturnValue
@SchedulerSupport(SchedulerSupport.NONE)
public static <T> Single<T> just(final T item) {
    ObjectHelper.requireNonNull(item, "value is null");

	//注释3
    return RxJavaPlugins.onAssembly(new SingleJust<T>(item));
}

@NonNull
public static <T> Single<T> onAssembly(@NonNull Single<T> source) {
    Function<? super Single, ? extends Single> f = onSingleAssembly;
    if (f != null) {
        return apply(f, source);
    }
    
    //注释4
    return source;
}

just方法的参数item是泛型T,就是要发送的数据(本例中的数字1),在注释3处在onAssembly方法的参数中,创建了一个SingleJust对象,onAssembly方法的参数类型的Single,而SingleJust是Single的子类,在注释4处返回的source对象,就是注释3处创建的SingleJust对象,下面看下SingleJust类的源码:

public final class SingleJust<T> extends Single<T> {

    final T value;

    public SingleJust(T value) {
        this.value = value;
    }

    @Override
    protected void subscribeActual(SingleObserver<? super T> s) {
		//注释5
        s.onSubscribe(Disposables.disposed());
        s.onSuccess(value);
    }

}

从SingleJust的源码可知,SingleJust确实是继承了Single,要发送的数据item通过SingleJust的构造方法传入并赋值给变量value。

3、注释2处的subscribe订阅方法源码如下:

@SchedulerSupport(SchedulerSupport.NONE)
@Override
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 {
    	//注释6
        subscribeActual(subscriber);
    } catch (NullPointerException ex) {
        throw ex;
    } catch (Throwable ex) {
        Exceptions.throwIfFatal(ex);
        NullPointerException npe = new NullPointerException("subscribeActual failed");
        npe.initCause(ex);
        throw npe;
    }
}

在注释6处调用了subscribeActual方法,这个方法里的参数subscriber是订阅的时候创建的一个观察者对象,integerSingle的真身是SingleJust,所以这里调用的SingleJust的subscribeActual方法,SingleJust的subscribeActual方法的源码可以查看上文中SingleJust的源码部分,在注释5处调用了观察者的onSubscribe和onSuccess方法,而onSuccess方法中的值就是上游要发送的数据(本例是数字1),这样观察者在下游就可以拿到数据了。

你可能感兴趣的:(Android,Rxjava,Single,android)