Rxjava2~from****那么多方法~學(xué)渣帶你扣rxjava2

我都不知道自己哪里來的毅力。死扣這幾個(gè)方法 但是 我想在就是想。 這幾個(gè)方法 扣到哪里算哪里。今天沒完成,會(huì)在轉(zhuǎn)天繼續(xù)完成。我會(huì)一直補(bǔ)充

Paste_Image.png

fromCallable

Returns an Observable that, when an observer subscribes to it, invokes a function you specify and then emits the value returned from that function.

This allows you to defer the execution of the function you specify until an observer subscribes to the ObservableSource. That is to say, it makes the function "lazy."

這是官網(wǎng)的解釋。

Calls a Callable and emits its resulting single value or signals its exception.
這句話是對(duì)
ObservableFromCallable的描述

我們現(xiàn)不解釋 先來看來那個(gè)例子
<pre>

    Observable.fromCallable(new Callable<Object>() {
        @Override
        public Object call() throws Exception {
            return Observable.just("one", "two", "three", "four", "five");
        }
    }).subscribe( getSubscriber() );

    Observable.defer(new Callable<ObservableSource<? extends String>>() {
        @Override
        public ObservableSource<? extends String> call() throws Exception {
            // Do some long running operation
            SystemClock.sleep(2000);
            return Observable.just("one", "two", "three", "four", "five");
        }
    }).subscribe( getSubscriber() );



 Observer<Object> getSubscriber() {
    return new Observer<Object>() {

        @Override
        public void onError(Throwable e) {
            Log.i("RxJava", "onError : " + e.toString());
        }

        @Override
        public void onComplete() {
            Log.i("RxJava", "onCompleted");

        }

        @Override
        public void onSubscribe(Disposable d) {

        }

        @Override
        public void onNext(Object o) {
            Log.i("RxJava", "onNext : " + o);
            Log.i("RxJava", Thread.currentThread().getName());
        }
    };
}

</pre>

<pre>
06-23 08:55:53.313 26651-26651/com.rxjava2.android.samples I/RxJava: onNext : io.reactivex.internal.operators.observable.ObservableFromArray@39ee6818
06-23 08:55:53.313 26651-26651/com.rxjava2.android.samples I/RxJava: main
06-23 08:55:53.313 26651-26651/com.rxjava2.android.samples I/RxJava: onCompleted
06-23 08:55:55.315 26651-26651/com.rxjava2.android.samples I/RxJava: onNext : one
06-23 08:55:55.315 26651-26651/com.rxjava2.android.samples I/RxJava: main
06-23 08:55:55.315 26651-26651/com.rxjava2.android.samples I/RxJava: onNext : two
06-23 08:55:55.315 26651-26651/com.rxjava2.android.samples I/RxJava: main
06-23 08:55:55.315 26651-26651/com.rxjava2.android.samples I/RxJava: onNext : three
06-23 08:55:55.315 26651-26651/com.rxjava2.android.samples I/RxJava: main
06-23 08:55:55.315 26651-26651/com.rxjava2.android.samples I/RxJava: onNext : four
06-23 08:55:55.315 26651-26651/com.rxjava2.android.samples I/RxJava: main
06-23 08:55:55.315 26651-26651/com.rxjava2.android.samples I/RxJava: onNext : five
06-23 08:55:55.315 26651-26651/com.rxjava2.android.samples I/RxJava: main
06-23 08:55:55.315 26651-26651/com.rxjava2.android.samples I/RxJava: onCompleted
</pre>

可以看出來來什么?fromCallable的接口直接傳過來的是一個(gè)對(duì)象,defer根據(jù)對(duì)象個(gè)的個(gè)人分別傳送。這是因?yàn)槭裁茨兀?我們往下看

這是ObservableDefer的subscribeActual
<pre>
public void subscribeActual(Observer<? super T> s) {
ObservableSource<? extends T> pub;
try {
pub = ObjectHelper.requireNonNull(supplier.call(), "null publisher supplied");
} catch (Throwable t) {
Exceptions.throwIfFatal(t);
EmptyDisposable.error(t, s);
return;
}

    pub.subscribe(s);
}

</pre>
我們之前分析過pub.subscribe(s);這方法決定了 。 你call的值還是要按照Observable對(duì)象的創(chuàng)建方式去別人調(diào)用onnext這些方法。

這是ObservableFromCallable的subscribeActual
<pre>
public void subscribeActual(Observer<? super T> s) {
DeferredScalarDisposable<T> d = new DeferredScalarDisposable<T>(s);
s.onSubscribe(d);
if (d.isDisposed()) {
return;
}
T value;
try {
value = ObjectHelper.requireNonNull(callable.call(), "Callable returned null");
} catch (Throwable e) {
Exceptions.throwIfFatal(e);
if (!d.isDisposed()) {
s.onError(e);
} else {
RxJavaPlugins.onError(e);
}
return;
}
d.complete(value);
}
</pre>

發(fā)現(xiàn)了沒有這個(gè)并沒有。而是直接一個(gè)value,全部發(fā)送回去。
因此 我們可以說這個(gè)方法?;卣{(diào)回去的值不論幾個(gè)都會(huì)全部發(fā)送

下面看第二個(gè)方法

Observable.fromArray()這個(gè)方法
<pre>
public static <T> Observable<T> fromArray(T... items) {
ObjectHelper.requireNonNull(items, "items is null");
if (items.length == 0) {
return empty();
} else
if (items.length == 1) {
return just(items[0]);
}
return RxJavaPlugins.onAssembly(new ObservableFromArray<T>(items));
}
</pre>

看著眼熟嗎? 沒錯(cuò)和just 一模一樣。區(qū)別 just有數(shù)量限制

第三個(gè)方法
fromFuture

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容