一次Observable的empty和never方法的rx源码笔记

栏目: Java · 发布时间: 5年前

内容简介:我们在用

我们在用 RxJava 的时候,如果需要在某个地方需要中断事件流,那么直接返回一个 Observable.empty() ,与它有类似功能的有 Observable.never

Observable.just(1,2,3,4,5)
    .flatMap((Func1<Integer, Observable<Object>>) integer -> {
        if (integer > 3) {
            return Observable.empty();
            //return Observable.never();
        } else {
            return Observable.just(integer);
        }
    })
    .subscribe(new Subscriber<Object>() {
        @Override
        public void onCompleted() {
            System.out.println("onCompleted");
        }
        @Override
        public void onError(Throwable e) {
            System.out.println("onError");
        }
        @Override
        public void onNext(Object o) {
            System.out.println("onNext");
            System.out.println(Integer.valueOf(o.toString()));
        }
    });

Observable.never 的输出结果:

onNext
1
onNext
2
onNext
3

Observable.empty 的输出结果:

onNext
1
onNext
2
onNext
3
onCompleted

从结果可以看出来, Observable.empty 会执行 订阅者onCompleted 方法, 而 Observable.never 方法则是立即终止整个流程。

源码分析(RxJava1.3.0):

public class Observable<T> {
    public static <T> Observable<T> never() {
        return NeverObservableHolder.instance();
    }
    /***部分代码省略***/
    public static <T> Observable<T> empty() {
        return EmptyObservableHolder.instance();
    }
}
public enum EmptyObservableHolder implements OnSubscribe<Object> {
    INSTANCE;
    static final Observable<Object> EMPTY = Observable.unsafeCreate(INSTANCE);
    @SuppressWarnings("unchecked")
    public static <T> Observable<T> instance() {
        return (Observable<T>)EMPTY;
    }
    @Override
    public void call(Subscriber<? super Object> child) {
        child.onCompleted();
    }
}
public enum NeverObservableHolder implements OnSubscribe<Object> {
    INSTANCE;
    static final Observable<Object> NEVER = Observable.unsafeCreate(INSTANCE);
    @SuppressWarnings("unchecked")
    public static <T> Observable<T> instance() {
        return (Observable<T>)NEVER;
    }
    @Override
    public void call(Subscriber<? super Object> child) {
        // deliberately no op
    }
}

Observable.empty()Observable.never 我们从源码实现就可以看出来两者的功能。

文章到这里就全部讲述完啦,若有其他需要交流的可以留言哦~!~!

想阅读作者的更多文章,可以查看我个人博客 和公共号:

一次Observable的empty和never方法的rx源码笔记

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

日赚500元

日赚500元

董俊峰 / 2008-5 / 20.00元

《日赚500元:揭开网络赚钱的秘密》是一本大学生网络创业必看的图书,一本想在网络上创业的人必看的图书。懂懂团队第一个操作Google FireFox下载项目,第一个操作“域名停靠”项目。第一个操作Google账号推介项目。首次提出“网赚”这个概念,并创造性地将“网赚”的过程分为3个阶段。《日赚500元:揭开网络赚钱的秘密》揭开了网络上一些行为的本质。一起来看看 《日赚500元》 这本书的介绍吧!

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具