RxJava操作符——Observable.from

使用

from操作符支持傳入Iterable或者數組然後創建一個Observable,在開啓訂閱的時候會將Iterable或者數組中的元素當成事件內容依次發出

List<String> yys = new ArrayList<>();
yys.add("野猿新一");
yys.add("野猿新二");
yys.add("野猿新三");
Observable.from(yys)
        .subscribe(new Action1<String>() {
            @Override
            public void call(String s) {
                Log.d("Himmy", s);
            }
        });

輸出結果

02-17 15:46:26.577 12442-12442/com.him.hisapp D/Himmy: 野猿新一
02-17 15:46:26.577 12442-12442/com.him.hisapp D/Himmy: 野猿新二
02-17 15:46:26.577 12442-12442/com.him.hisapp D/Himmy: 野猿新三

源碼解析

爲了降低理解難度,本文解析基於1.0.0版本源碼

from(T[] array)內部其實是調用from(Iterable<? extends T> iterable),通過asList先將數組轉成Iterable

public final static <T> Observable<T> from(T[] array) {
    return from(Arrays.asList(array));
}

 from(Iterable<? extends T> iterable)中調用create方法創建一個Observable,參數是OnSubscribeFromIterable類型

public final static <T> Observable<T> from(Iterable<? extends T> iterable) {
    return create(new OnSubscribeFromIterable<T>(iterable));
}

接下來OnSubscribeFromIterable的內部實現,OnSubscribeFromIterable繼承OnSubscribe,主要看其內部實現的call()方法,該方法用於發出事件,通過o.setProducer設置一個IterableProducer

@Override
public void call(final Subscriber<? super T> o) {
    final Iterator<? extends T> it = is.iterator();
    o.setProducer(new IterableProducer<T>(o, it));
}

我們先看下Subscriber.setProducer()方法的內部實現的僞代碼,其內部最終是調用Producer的request()方法

public void setProducer(Producer producer) {
    // 省略其他代碼
    p.request(Long.MAX_VALUE);
    // 省略其他代碼
}

接下來看IterableProducer.request()方法的內部實現僞代碼,其內部將Iterator中的元素一個個取出來,然後通過onNext發送出去,在Subscriber中就可以依次接收到這些消息

private static final class IterableProducer<T> implements Producer {
    private final Subscriber<? super T> o;
    private final Iterator<? extends T> it;

    private IterableProducer(Subscriber<? super T> o, Iterator<? extends T> it) {
        this.o = o;
        this.it = it;
    }

    @Override
    public void request(long n) {
        // 省略其他代碼
        while (it.hasNext()) {
            if (o.isUnsubscribed()) {
                return;
            }
            o.onNext(it.next());
        }
        if (!o.isUnsubscribed()) {
            o.onCompleted();
        }
        // 省略其他代碼
    }
}

瞭解了from方法的內部實現,我們也可以自己寫一個from

public final static <T> Observable<T> from(final Iterable<? extends T> iterable) {
    return Observable.create(new Observable.OnSubscribe<T>() {
        @Override
        public void call(Subscriber<? super T> subscriber) {
            Iterator<? extends T> it = iterable.iterator();
            while (it.hasNext()) {
                subscriber.onNext(it.next());
            }
            subscriber.onCompleted();
        }
    });
}

結果是一樣的,至於RxJava中爲何要實現得那麼複雜(比上面展示的僞代碼還複雜)肯定有其原因,只是我目前功力不夠也沒去深究

private void test() {
    final List<String> yys = new ArrayList<>();
    yys.add("野猿新一");
    yys.add("野猿新二");
    yys.add("野猿新三");
    from(yys).subscribe(new Action1<String>() {
        @Override
        public void call(String s) {
            Log.d("Himmy", s);
        }
    });
}

 

 

發佈了280 篇原創文章 · 獲贊 44 · 訪問量 14萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章