RxJava響應式函數(shù)編程也在Android開發(fā)中流行起來了,最大的好處的話就是,在程序邏輯異常復雜的情況下,仍然可以讓代碼的邏輯保持簡潔.
現(xiàn)在就簡單的介紹一下它的使用首先添加Rx相關的依賴
compile 'io.reactivex:rxjava:1.2.4'
compile 'io.reactivex:rxandroid:1.2.1'
RxJava里面的被觀察者Observable ,觀察者Observer之間的關系,就像Button點擊監(jiān)聽類似,Button通過setOnClickListener將Button與OnClickListener聯(lián)系起來了.一旦Button被點擊,OnClickListener就會執(zhí)行onClick()方法,
同樣的RxJava里面的Observable 通過subscribe 與Observer建立聯(lián)系,一旦Observable 有觸發(fā)一下操作,就會對應的執(zhí)行onNext(),onCompleted();或者onNext(), onError():
* onNext():普通事件
* onCompleted():事件隊列完結
* onError(): 事件隊列異常
借用之前有個大神和我說的一個案例,現(xiàn)有一個數(shù)組 String[] arr ={"abcd", "bcde", "cdef"}, 把其中以字母"a"開頭的字符串找出來并加上"from Alpha",最后打印出新的字符串的長度
普通方法我們做法是這樣的,
for (int i = 0; i < arr.length; i++) {
String temp = arr[i];
if (temp.startsWith("a")) {
temp += " from Alpha";
System.out.println("traditional:" + temp + temp.length());
}
用RxJava寫的話就是這樣,而且這里Observer實際執(zhí)行的方法的話就是onNext(),onCompleted();
Observable.from(arr)
//過濾
.filter(new Func1<String, Boolean>() {
@Override
public Boolean call(String s) {
return s.startsWith("a");
}
//訂閱關聯(lián)
})
.subscribe(new Observer<String>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(String s) {
//參數(shù)列表中的s就是數(shù)組arr中過濾出來滿足條件的字符串了
String temp = s += " from Alpha";
System.out.println("RxJava:" + temp + temp.length());
}
});
為了方便理解,我就舉個例子(呵呵,就不用買栗子了,雖然有點強行,應該比直接看代碼好理解),
Observable(被觀察者)就像小偷,Observer(觀察者)就像警察
首先小偷的關注的是美女的背包,在意的是背包里面的錢包,然后從背包挑出(filter)錢包,最后被警察觀察到了(subscribe),然后(onNext)警察做出回應,逮捕小偷,得到小偷偷走的錢包
所以最后代碼表示的話就是這樣
小偷.from(美女背包)
//通過過濾器判斷
.filter(new Func1<物品, 是否是錢包>() {
@Override
public Boolean call(物品 s) {
return 通過對物品觀察觸摸,判斷是否為錢包;
}
//訂閱關聯(lián)
})
.subscribe(new 警察<物品>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(物品s) {
//參數(shù)列表中的s就是美女背包中挑選出來的錢包了
最后將得到的錢吧交回美女失主,然后和警察一起回警察局做筆錄
,然后美女愛上了警察...然后就沒有然后了.....(自己YY去吧);
}
});
需要注意的是這里onNext()方法可能會執(zhí)行多次如果數(shù)組arr里面有多個滿足條件的字符串就會執(zhí)行多次當然沒有滿足條件的就不會執(zhí)行,但是onCompleted():事件隊列完結方法只會執(zhí)行一次
相信有了上面的例子已經(jīng)對RxJava有個大概印象了,
現(xiàn)在總結下步驟吧:
1.創(chuàng)建Observable(被觀察者)
Observable.just(T...) 參數(shù)為單個的
Observable.from(T[]) / Observable.from(Iterable<? extends T>) 參數(shù)為數(shù)組或Iterable
由于是數(shù)組所以用的是from().
2.filter(過濾器)
3.Observer(觀察者)
4.subscribe(訂閱,建立聯(lián)系)
如果只想關心onNext方法可以直接用Action1,這樣代碼會簡潔很多
observable.subscribe(observer);
Observable.from(arr)
.filter(new Func1<String, Boolean>() {
@Override
public Boolean call(String s) {
return s.startsWith("a");
}
})
.subscribe(new Action1<String>() {
@Override
public void call(String s) {
String temp = s += " from Alpha";
System.out.println("RxJava:" + temp + temp.length());
}
});
當然這只是一點基本使用.
練習Demo下載:https://github.com/starrysky0/RxjavaDemo