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

 

 

posted @ 2020-02-17 16:47  野猿新一  阅读(56)  评论(0编辑  收藏  举报