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

示例代碼如下:

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的數據流轉運算符將在後續的博客中進行講解,敬請關注!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章