創(chuàng)建操作符目錄
由ReactiveX: http://reactivex.io/documentation/operators.html 支持坡疼。
1: Create
Create操作符: 使用OnSubscribe從頭創(chuàng)建一個(gè)Observable侥钳。OnSubscribe會(huì)在訂閱發(fā)生時(shí)箱歧,調(diào)用內(nèi)部的call方法,實(shí)現(xiàn)調(diào)用onnext等方法淮椰。
Observable.create(new Observable.OnSubscribe<String>() {
@Override
public void call(Subscriber<? super String> subscriber) {
subscriber.onNext("hello Rxjava");
}
}).subscribe(new Subscriber<String>() {
@Override
public void onCompleted() {
Log.d(TAG, "onCompleted: ");
}
@Override
public void onError(Throwable e) {
Log.d(TAG, "onError: ");
}
@Override
public void onNext(String s) {
Log.d(TAG, "onNext: "+s);
}
});
結(jié)果:
03-15 16:35:18.191 27050-27050/com.nnews D/RxOperatorsTest: onNext: hello Rxjava
Observable.create中傳入OnSubscribe作為對(duì)象捂贿,當(dāng)Observable.subscribe()訂閱時(shí),會(huì)調(diào)用OnSubscribe的回調(diào)方法Call, 然后可以在Call方法中通過參數(shù)subscriber觀察者的onNext(), onError(), onCompleted()等方法執(zhí)行祝拯,就傳遞到訂閱的觀察者回調(diào)方法中。
看圖:
create() 方法是 RxJava 最基本的創(chuàng)造事件序列的方法,
2: Just
just操作符:將指定類型的object創(chuàng)建為Observable對(duì)象她肯,按照順序發(fā)射給Observer,調(diào)用onNext(),onNext()...佳头,最后onComplete()
Observable.just("111","222").subscribe(new Action1<String>() {
@Override
public void call(String string) {
Log.d(TAG, "call: "+string+",Thead="+Thread.currentThread().getName());
}
});
結(jié)果:
03-15 16:27:47.644 18868-18868/com.nnews D/RxOperatorsTest: call: 111,Thead=main
03-15 16:27:47.644 18868-18868/com.nnews D/RxOperatorsTest: call: 222,Thead=main
源碼:
public static <T> Observable<T> just(T t1, T t2) {
return from((T[])new Object[] { t1, t2 });
}
可以看出鹰贵,調(diào)用了from的方法,下面介紹from
3:From
From操作符:將傳入的數(shù)組或 Iterable 拆分成具體對(duì)象Observable后康嘉,依次發(fā)射出來,調(diào)用onNext(), onNext() ..., 最后onComplete()
String[] mArray = {"111","222"};
Observable.from(mArray)
.subscribe(new Action1<String>() {
@Override
public void call(String s) {
Log.d(TAG, "call: "+s+",Thead="+Thread.currentThread().getName());
}
});
結(jié)果:
03-15 16:48:28.389 10123-10123/com.nnews D/RxOperatorsTest: call: 111,Thead=main
03-15 16:48:28.389 10123-10123/com.nnews D/RxOperatorsTest: call: 222,Thead=main
源碼:
public static <T> Observable<T> from(T[] array) {
int n = array.length;
if (n == 0) {
return empty();
} else
if (n == 1) {
return just(array[0]);
}
return create(new OnSubscribeFromArray<T>(array));
}
可以看出砾莱,最后調(diào)用了create方法,到這里明白了凄鼻,just,from操作符最終都是調(diào)用create操作符實(shí)現(xiàn)的聚假!
4: Interval
Interval操作符:創(chuàng)建一個(gè)按照一定時(shí)間間隔, 發(fā)射出來的Observable.
場景:定時(shí)去獲取推送接口的消息块蚌,提通知用戶
Observable.interval(2, TimeUnit.SECONDS)
.subscribe(new Action1<Long>() {
@Override
public void call(Long aLong) {
Log.d(TAG, "call: "+aLong+",Thead="+Thread.currentThread().getName());
}
});
結(jié)果:
03-15 17:05:51.383 28561-28621/com.nnews D/RxOperatorsTest: call: 0,Thead=RxComputationScheduler-1
03-15 17:05:53.383 28561-28621/com.nnews D/RxOperatorsTest: call: 1,Thead=RxComputationScheduler-1
03-15 17:05:55.383 28561-28621/com.nnews D/RxOperatorsTest: call: 2,Thead=RxComputationScheduler-1
03-15 17:05:57.383 28561-28621/com.nnews D/RxOperatorsTest: call: 3,Thead=RxComputationScheduler-1
03-15 17:05:59.383 28561-28621/com.nnews D/RxOperatorsTest: call: 4,Thead=RxComputationScheduler-1
03-15 17:06:01.383 28561-28621/com.nnews D/RxOperatorsTest: call: 5,Thead=RxComputationScheduler-1
可以看到,每隔2秒膘格,打印一次峭范,注意到不是工作在主線程了哦!
interval相當(dāng)于定時(shí)器瘪贱,定時(shí)創(chuàng)建Obserable纱控,然后發(fā)射, 調(diào)用onNext()...
5:Range
range操作符: 根據(jù)初始值n和數(shù)目m, 發(fā)射n,n+1,n+2...,n+m-1,范圍的數(shù)值
Android場景:獲取數(shù)據(jù)的前20條展示等
Sample:
Observable.range(16,3)
.subscribe(new Action1<Integer>() {
@Override
public void call(Integer integer) {
Log.d(TAG, "call: "+integer+",Thead="+Thread.currentThread().getName());
}
});
結(jié)果:
03-15 17:20:38.929 13010-13010/com.nnews D/RxOperatorsTest: call: 16,Thead=main
03-15 17:20:38.929 13010-13010/com.nnews D/RxOperatorsTest: call: 17,Thead=main
03-15 17:20:38.929 13010-13010/com.nnews D/RxOperatorsTest: call: 18,Thead=main
6: Repeat
repeat操作符:創(chuàng)建一個(gè)observable,然后重復(fù)發(fā)射n次
Observable.just("1")
.repeat(5)
.subscribe(new Subscriber<String>() {
@Override
public void onCompleted() {
Log.d(TAG, "onCompleted: ");
}
@Override
public void onError(Throwable e) {
Log.d(TAG, "onError: ");
}
@Override
public void onNext(String s) {
Log.d(TAG, "onNext: "+s);
}
});
結(jié)果:
03-15 17:26:32.157 19799-19799/com.nnews D/RxOperatorsTest: onNext: 1
03-15 17:26:32.158 19799-19799/com.nnews D/RxOperatorsTest: onNext: 1
03-15 17:26:32.158 19799-19799/com.nnews D/RxOperatorsTest: onNext: 1
03-15 17:26:32.159 19799-19799/com.nnews D/RxOperatorsTest: onNext: 1
03-15 17:26:32.159 19799-19799/com.nnews D/RxOperatorsTest: onNext: 1
03-15 17:26:32.159 19799-19799/com.nnews D/RxOperatorsTest: onCompleted:
7: Timer
timer操作符既可以延遲執(zhí)行一段邏輯菜秦,也可以間隔執(zhí)行一段邏輯甜害。
場景: Android 實(shí)際中,app開啟時(shí)球昨,延時(shí)加載初始化數(shù)據(jù)尔店,然后跳到新頁面
**Sample: **
/***
* 延時(shí)5秒,app啟動(dòng)時(shí)主慰,加載圖片嚣州,然后開啟新頁面
*/
Observable.timer(5, TimeUnit.SECONDS)
.subscribe(new Action1<Long>() {
@Override
public void call(Long aLong) {
mActivity.startActivity(new Intent(mActivity, newActivity));
}
});
第二個(gè)方法,還可以調(diào)度線程
8.empty/Never/Throw
Empty:創(chuàng)建一個(gè)不發(fā)射任何數(shù)據(jù)但是正常終止的Observable共螺, 只調(diào)用onComplete方法
Never:創(chuàng)建一個(gè)不發(fā)射數(shù)據(jù)也不終止的Observable, 不調(diào)用observer的方法
Throw :創(chuàng)建一個(gè)不發(fā)射數(shù)據(jù)以一個(gè)錯(cuò)誤終止的Observable该肴,只調(diào)用onError方法
總結(jié):上述的創(chuàng)建操作符看源碼會(huì)發(fā)現(xiàn),最終都是創(chuàng)建Observale然后發(fā)射給observer藐不,由被觀察者調(diào)用了觀察者的回調(diào)方法匀哄,就實(shí)現(xiàn)了由被觀察者向觀察者的事件傳遞,即觀察者模式佳吞。
到這里常用的 “創(chuàng)建操作符” 就好了拱雏,有時(shí)看了還是人家的,多敲敲代碼底扳,看看Api铸抑,成為自己的,用到項(xiàng)目中衷模,實(shí)現(xiàn)它的價(jià)值鹊汛!