從2015年10月份知道RxJava并使用過一次之后雨涛,因為工作忙的原因一直沒有再去接觸過這個讓人無法抗拒的編程接口碧浊。經過幾天的學習之后把學習的東西總結一下,畢竟才接觸隘击,若有不對的地方侍芝,請留言指正研铆。
我的學習資料
2棵红、Awesome RxJava
創(chuàng)建操作
真可惜簡書不支持錨點
這篇文章只是介紹操作符中的創(chuàng)建操作,其實創(chuàng)建操作包括了一些其他方面知識咧栗,比如調度器窄赋,我們會在后面的文章中講解。
Create
使用一個函數從頭開始創(chuàng)建一個Observable,并設置一個接受觀察者函數作為參數可岂,并讓其恰當的調用觀察者的onNext错敢,onError,onCompeleted方法缕粹。
(ps:建議你在傳遞給create方法的函數中檢查觀察者的isUnsubscribed狀態(tài)稚茅,以便在沒有觀察者的時候,讓其停止發(fā)射數據或者做昂貴的運算平斩。)
public static void create() {
Observable.create(new OnSubscribe<Integer>() { //這里泛型所指的參數既為發(fā)射數據的類型
@Override
public void call(Subscriber<? super Integer> observer) {
try {
if (observer.isUnsubscribed()) { //
for (int i = 0; i < 3; i++) {
observer.onNext(i); //發(fā)射數據給觀察者
}
}
observer.onCompleted(); //發(fā)射完畢
} catch (Exception e) {
observer.onError(e); //發(fā)射出錯
}
}
}).subscribe(new Observer<Integer>() {
@Override
public void onCompleted() {
System.out.println("onCompleted");
}
@Override
public void onError(Throwable e) {
System.out.println("onError :" + e.getMessage());
}
@Override
public void onNext(Integer t) {
System.out.println("onNext : " + t);
}
});
}
}
Defer
直到有觀察者訂閱時才創(chuàng)建Observable亚享,并且為每個觀察者創(chuàng)建一個新的Observable。也就是說绘面,只要有觀察者訂閱了它欺税,就將其包含的數據全部發(fā)送給觀察者。
在這里我先補充一點揭璃,觀察者訂閱有很多種形式存在晚凿,我們可以查看subscribe的API
public final Subscription subscribe(final Action1<? super T> onNext) {
...
return subscribe(new ActionSubscriber<T>(onNext, onError, onCompleted));
}
public final Subscription subscribe(final Action1<? super T> onNext, final Action1<Throwable> onError) {
...
return subscribe(new ActionSubscriber<T>(onNext, onError, onCompleted));
}
public final Subscription subscribe(final Action1<? super T> onNext, final Action1<Throwable> onError, final Action0 onCompleted) {
...
return subscribe(new ActionSubscriber<T>(onNext, onError, onCompleted));
}
以上三種都是根據情況來設置相應參數,比如我只用處理發(fā)送過來的數據瘦馍,其他的都不管歼秽,就可以使用第一個方法,以此類推情组。
public final Subscription subscribe(final Observer<? super T> observer) {
if (observer instanceof Subscriber) {
return subscribe((Subscriber<? super T>)observer);
}
if (observer == null) {
throw new NullPointerException("observer is null");
}
return subscribe(new ObserverSubscriber<T>(observer));
}
public final Subscription subscribe(Subscriber<? super T> subscriber) {
return Observable.subscribe(subscriber, this);
}
這二個種方法比較特殊燥筷。以上方法其實最后調用的都是
Observable.subscribe(subscriber, this)
總而言之就是將訂閱者和被觀察者綁定起來。
說了這么多院崇,我們看下defer的用法:
public static void defer() {
Observable<String> defer = Observable.defer(new Func0<Observable<String>>() {
@Override
public Observable<String> call() {
return Observable.just("1","2","3") ;
}
});
Action1<String> observer1 = new Action1<String>() {
@Override
public void call(String t) {
System.out.println("observer1 onNext :" + t);
}
};
defer.subscribe(observer1);
Subscriber<String> observer2 = new Subscriber<String>() {
@Override
public void onStart() {
System.out.println("onStart");
}
@Override
public void onNext(String t) {
System.out.println("observer2 onNext :" + t);
}
@Override
public void onError(Throwable e) {
}
@Override
public void onCompleted() {
System.out.println("observer2 onCompleted :");
}
};
defer.subscribe(observer2);
}
第一次使用簡書的編輯功能肆氓,發(fā)現太多的MarkDown功能都不支持。
在這個例子中亚脆,使用了Action和Subscribe作為參數綁定被觀察者做院,而且defer方法中返回的是一個Observable對象,剛好和我們之前講的會為每個觀察者創(chuàng)建一個新的Observable。這個Observable再將數據發(fā)射給觀察者键耕。
輸出結果:
observer1 onNext :1
observer1 onNext :2
observer1 onNext :3
onStart
observer2 onNext :1
observer2 onNext :2
observer2 onNext :3
observer2 onCompleted
From
from操作可以轉換Future寺滚、Iterable和數組。對于Iterable和數組屈雄,產生的Observable會發(fā)射Iterable或者數組的每一項數據村视。
將create操作符中的示例代碼用from操作符寫出來
public static void from() {
Integer[] ints = {1,2,3};
Observable.from(ints)
.subscribe(new Observer<Integer>() {
@Override
public void onCompleted() {
System.out.println("onCompleted");
}
@Override
public void onError(Throwable e) {
System.out.println("onError :" + e.getMessage());
}
@Override
public void onNext(Integer t) {
System.out.println("onNext : " + t);
}
});
}
這種方法簡單,但是不能判斷出是否觀察者取消了訂閱酒奶,可能會造成浪費蚁孔。
Interval
創(chuàng)建一個按固定時間間隔發(fā)射整數序列的Observable。
public static void interval() {
Observable.interval(1000,TimeUnit.MILLISECONDS,Schedulers.immediate())
.subscribe(new Action1<Long>() {
@Override
public void call(Long value) {
// TODO Auto-generated method stub
System.out.println("interval value : " + value);
}
});
}
Just
Just類似于From,但是From會將數組取出然后逐個發(fā)射惋嚎,而Just只是簡單的原樣發(fā)射杠氢。
Observable.just("hello","world")
.observeOn(Schedulers.immediate())
.subscribe(new Action1<String>() {
@Override
public void call(String t) {
// TODO Auto-generated method stub
System.out.println(Thread.currentThread().getName());
System.out.println(t);
}
});
Range
發(fā)射一個范圍類有序的整數序列,你可以指定范圍的起始和長度
Observable.range(0, 10)
.subscribe(new Action1<Integer>() {
@Override
public void call(Integer t) {
// TODO Auto-generated method stub
System.out.println(t);
}
});
Repeat
Observable.just("1","2")
.repeat(3)
.subscribe(new Observer<String>() {
@Override
public void onCompleted() {
System.out.println("onCompleted");
}
@Override
public void onError(Throwable e) {
System.out.println("error : "+e.getMessage());
}
@Override
public void onNext(String t) {
System.out.println(t + " " + Thread.currentThread().getName());
}
});
Timer
創(chuàng)建一個Observable另伍,它在一個給定的延遲會發(fā)射一個特殊的值(0)
Observable.timer(5, TimeUnit.SECONDS)
.subscribe(new Action1<Long>() {
@Override
public void call(Long t) {
System.out.println("hello world!");
}
});