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