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

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

内容简介:我们在用

我们在用 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源码笔记

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

查看所有标签

猜你喜欢:

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

How to Build a Billion Dollar App

How to Build a Billion Dollar App

George Berkowski / Little, Brown Book Group / 2015-4-1 / USD 24.95

Apps have changed the way we communicate, shop, play, interact and travel and their phenomenal popularity has presented possibly the biggest business opportunity in history. In How to Build a Billi......一起来看看 《How to Build a Billion Dollar App》 这本书的介绍吧!

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

在线进制转换器
在线进制转换器

各进制数互转换器

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具