Android框架——RxJava(二)创建操作符

RxJava(二)创建操作符

RxJava学习系列

在前一篇RxJava的基本使用中,已经讲述了RxJava的实现步骤以及线程调度的基本知识,本篇博客主要针对RxJava中创建Observable的各种方式进行讲解(本文代码都是使用了Lambda表达式)。


RxJava提供了各种的创建操作运算符来创建Observable对象,有有createfromjustrangeintervaltimerdeferemptynevererror。关于前三种运算符,在上篇博客中已经讲过了,所以就不在这里进行赘述了。

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()

示例代码如下:

扫描二维码关注公众号,回复: 3280654 查看本文章
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成功后就不会改变了。

我们来看下deferjust的对比:

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的数据流转运算符将在后续的博客中进行讲解,敬请关注!

猜你喜欢

转载自blog.csdn.net/boyeleven/article/details/81875271
今日推荐