RxJava(二)创建操作符
- RxJava(一)概述与基本使用
- RxJava(二)创建操作符
在前一篇RxJava的基本使用中,已经讲述了RxJava的实现步骤以及线程调度的基本知识,本篇博客主要针对RxJava中创建Observable
的各种方式进行讲解(本文代码都是使用了Lambda表达式)。
RxJava提供了各种的创建操作运算符来创建Observable
对象,有有create
,from
,just
,range
,interval
,timer
,defer
,empty
,never
,error
。关于前三种运算符,在上篇博客中已经讲过了,所以就不在这里进行赘述了。
range
方法声明为:
Observable<Integer> range(int start, int count)
range
方法会生成start~start+count-1
的整数序列作为事件传入Observable
中,示例代码如下:
Observable observable = Observable.range(10, 5)
效果和Observable.just(10, 11, 12, 13, 14)
是一样的
interval
方法声明:
Observable<Long> interval(long period, TimeUnit unit)
Observable<Long> interval(long period, TimeUnit unit, Scheduler scheduler)
Observable<Long> interval(long initialDelay, long period, TimeUnit unit)
Observable<Long> interval(long initialDelay, long period, TimeUnit unit, Scheduler scheduler)
interval
会创建一个从0开始依次间隔固定的时间period * unit
(unit为时间单位)发送无限递增的自然数序列的Observable
,数据类型是Long
类型,scheduler
为指定创建自然数序列所在的线程,如果不指定,则默认是在Schedulers.computation()
线程上。initialDelay
表示发送第一个数据的初始延迟,不指定则为0。
当不指定interval线程时,默认是在Schedulers.computation()上产生数据的,而创建Observable和订阅都是在当前线程的,而且是非阻塞操作,因此结果会是数据还没有产生,主线程的程序就已经运行结束了,即不会有任何的输出
所以如果要看到输出,要么将interval的线程设置为当前线程Schedulers.immediate()
,要么将当前线程阻塞,比如调用System.in.read()
示例代码如下:
Observable.interval(1, TimeUnit.SECONDS, Schedulers.immediate())
.subscribe(value -> System.out.println(value));
运行后会持续不断的输出自然数序列
timer
timer
类似interval
,但比interval
简单多了,它的作用是在指定时间过后发送出一个整数0,方法声明如下:
Observable<Long> timer(long delay, TimeUnit unit)
Observable<Long> timer(long delay, TimeUnit unit, Scheduler scheduler)
示例代码如下:
Observable.timer(2, TimeUnit.SECONDS, Schedulers.immediate())
.subscribe(v -> System.out.println(v));
运行后会在延迟2秒后输出0
defer
defer
的作用在于一开始并不创建Observable
,而是在每次subscribe
创建一个新的Observable
对象,方法声明如下:
Observable<T> defer(Func0<Observable<T>> observableFactory)
即每次调用subscribe
后会去执行Func0
中的call
方法来创建并返回一个Observable
对象。而just
方法是一次创建Observable
成功后就不会改变了。
我们来看下defer
和just
的对比:
public static String s = "这是更改之前的语句";
public static void defer() {
Observable<String> justObservable = Observable.just(s);
Observable<String> deferObservable = Observable.defer(() -> Observable.just(s));
justObservable.subscribe(string -> System.out.println("justObservable: " + string));
deferObservable.subscribe(string -> System.out.println("deferObservable: " + string));
System.out.println("****************");
s = "这是更改之后的语句";
justObservable.subscribe(string -> System.out.println("justObservable: " + string));
deferObservable.subscribe(string -> System.out.println("deferObservable: " + string));
}
由于内部类引用外部的非成员变量需要final限定不可更改,这里就用成员变量来测试一下。
运行结果为:
justObservable: 这是更改之前的语句
deferObservable: 这是更改之前的语句
****************
justObservable: 这是更改之前的语句
deferObservable: 这是更改之后的语句
由此可以看出just
在创建好Observable
后就不会更改了,而defer
是依赖subscribe
来创建Observable
的
empty,never,error
这三个方法比较简单就放在一起讲了,方法声明如下:
Observable<T> empty()
Observable<T> never()
Observable<T> error(Throwable exception)
empty
:创建一个空的,不发送任何事件的Observable
,即只会调用OnCompleted
方法never
:创建一个空的,不发送任何事件但也不结束的Observable
,即不掉用任何事件回调函数error
:创建一个会发出异常事件的Observable
,会调用onError
方法
error
的例子:
Observable.error(new RuntimeException("This is my error"))
.subscribe(
v -> System.out.println(v),
e -> System.out.println(e.getMessage())
);
输出为:
This is my error
ps:以上就是RxJava关于创建Observable的各种操作运算符,RxJava的数据流转运算符将在后续的博客中进行讲解,敬请关注!