使用
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);
}
});
}