RxJava進階
RxJava進階一(創建類操作符)
RxJava進階二(轉換類操作符)
RxJava進階三(過濾類操作符)
RxJava進階四(組合類操作符)
前言
前面已經對RxJava原理進行介紹,相信大家對于RXJava已經有了初步的認識,但是在具體使用方面還有些懵懂,從這篇開始詳細介紹下RxJava的具體使用,首先介紹下RXJava的創建操作符~
操作符總覽
create、just、from、defer、range、interval、timer、empty、never
、error、repeat、delay...
具體使用介紹
create
create是RxJava最基本的創建操作符了,使用也是最簡單的~
create操作符運行結果
just
just操作符将某個對象轉化為Observable對象,并且将其發射出去,可以使一個數字、一個字符串、數組、Iterate對象等,是一種非常快捷的創建Observable對象的方法~
ListString stringList = new ArrayList
stringList.add("one");
stringList.add("two");
stringList.add("three");
Observable.just(stringList).subscribe(new SubscriberString() { @Override
public void onCompleted() {
} @Override
public void onError(Throwable e) {
} @Override
public void onNext(ListString strings) {
}
});
從代碼很清楚的看到,在onNext方法中輸出的是 ListString 對象。
from
from操作符用來将某個對象轉化為Observable對象,并且依次将其内容發射出去,from的接收值可以是集合或者數組,這個類似于just,但是just會将這個對象整個發射出去。比如說一個含有3個元素的集合,from會将集合分成3次發射,而使用just會發射一次來将整個的數組發射出去~
ListString stringList = new ArrayList
stringList.add("one");
stringList.add("two");
stringList.add("three");
Observable.from(stringList).subscribe(new SubscriberString() {
@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 s) {
System.out.println("String = " s);
}
});
很明顯,from對集合或數組對象進行了遍曆輸出。
defer
Defer操作符隻有當有Subscriber來訂閱的時候才會創建一個新的Observable對象,也就是說每次訂閱都會得到一個剛創建的最新的Observable對象,這可以确保Observable對象裡的數據是最新的,而just則沒有創建新的Observable對象,這樣說可能并不利于大家消化,看下邊與just對比示例~
Action1String action1 = new Action1String() {
@Override
public void call(String s) {
System.out.println(s);
}
}; // defer
ObservableString defer = Observable.defer(new Func0ObservableString() {
@Override
public ObservableString call() { Object o = new Object(); return Observable.just("defer : hashCode = " o.hashCode());
}
});
defer.subscribe(action1);
defer.subscribe(action1);
defer.subscribe(action1); // just
ObservableString just = Observable.just("just : hashCode = " new Object().hashCode());
just.subscribe(action1);
just.subscribe(action1);
just.subscribe(action1);
輸出結果
defer操作符運行結果
從輸出結果可以看出來,defer訂閱了三次,但是每次的地址值都發生了變化,而just則三次的地址值是同樣的,從而驗證了上面的結論。
range
Range操作符根據輸入的初始值【initial】和數量【number】發射number次、大于等于initial的值~
Observable.range(100, 5).subscribe(new Action1Integer() {
@Override public void call(Integer integer) {
System.out.println(integer);
}
});
range操作符運行結果
interval
Interval所創建的Observable對象會從0開始,每隔固定的時間發射一個數字,需要注意的是這個對象是運行在computation Scheduler,所以要更新UI需要在主線程中進行訂閱~
Observable
.interval(1, TimeUnit.SECONDS)
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Action1() {
@Override public void call(Long aLong) {
System.out.println(aLong);
}
});
輸出結果
interval操作符運行結果
timer
Timer會在指定時間後發射一個數字0,注意其也是運行在computation Scheduler~
Observable
.timer(2, TimeUnit.SECONDS)
.observeOn(AndroidSchedulers.mainThread())
.subscribe(aLong - { // 替代timertask與handler延遲,可以在這跳轉主界面
});
下面有幾個不常用的創建操作符,還是簡單介紹下吧~
empty
創建一個Observable不發射任何數據、而是立即調用onCompleted方法終止~
ObservableString empty = Observable.empty();
empty.subscribe(new SubscriberString() { @Override
public void onCompleted() {
System.out.println("onCompleted");
} @Override
public void onError(Throwable e) {
} @Override
public void onNext(String s) {
System.out.println("onNext");
}
});
輸出結果
empty操作符運行結果
never
創建一個Observable不發射任何數據、也不給訂閱ta的Observer發出任何通知~
ObservableString never = Observable.never();
never.subscribe(new SubscriberString() {
@Override public void onCompleted() {
System.out.println("onCompleted");
}
@Override public void onError(Throwable e) {
System.out.println(e.getMessage());
}
@Override public void onNext(String s) {
System.out.println("onNext");
}
});
輸出結果
never操作符運行結果
error
返回一個Observable,當有Observer訂閱ta時直接調用Observer的onError方法終止
ObservableString error = Observable.error(new Throwable("Observable.error"));
error.subscribe(new SubscriberString() {
@Override public void onCompleted() {
System.out.println("onCompleted");
}
@Override public void onError(Throwable e) {
System.out.println(e.getMessage());
}
@Override public void onNext(String s) {
System.out.println("onNext");
}
});
輸出結果
error操作符運行結果
接下來有兩個不是創建類操作符,但是行為能力與創建類操作符非常相似,故在此介紹下~
repeat
Repeat會将一個Observable對象重複發射,接收值是發射的次數,依然訂閱在 computation Scheduler~
Observable.just(1).repeat(10).subscribe(new Action1Integer() {
@Override public void call(Integer integer) {
System.out.println(integer);
}
});
輸出結果
repeat操作符運行結果
delay
功能與timer操作符一樣,但是delay用于在事件中,可以延遲發送事件中的某一次發送~
Observable.just(1).delay(2,TimeUnit.SECONDS).subscribe(new Action1Integer() {
@Override public void call(Integer integer) {
System.out.println(integer);
}
});
結語
創建類操作符,就簡單介紹到這裡,希望能夠對同學有所幫助,謝謝~
文/walid(簡書作者)
原文鍊接:http://www.jianshu.com/p/0cb521ba1e10
,
更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!