一次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源码笔记

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

查看所有标签

猜你喜欢:

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

移动的帝国

移动的帝国

曾航、刘羽、陶旭骏 / 浙江大学出版社 / 2014-1-1 / 48.00

日本是全世界移动互联网最发达的国家之一,堪称移动的帝国。在手机游戏、手机支付、移动医疗、移动电子商务、手机电视等方面,日本都充当了全球移动互联网的试验田。 曾经傲视全球的日本运营商将怎样面对转型的挑战?iPhone来势汹汹,如何打破封闭的日本移动互联网体系?日本在智能手机时代的手机游戏、O2O、移动医疗、移动广告等方面,涌现出了哪些值得借鉴的商业模式? 本书作者团队先后数次前往日本调研......一起来看看 《移动的帝国》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具