什么是RxJava##
- RxJava 就是異步
- RxJava 的異步實(shí)現(xiàn)情屹,是通過(guò)一種擴(kuò)展的觀察者模式來(lái)實(shí)現(xiàn)的阱佛。
- 一個(gè)響應(yīng)式編程框架
響應(yīng)式編程###
在說(shuō)響應(yīng)式編程的概念之前诵棵,我們先從這篇文章《用工廠流水線的方式來(lái)理解 RxJava 的概念》理解一下RxJava的意義。這里面說(shuō)到的流水線的例子很確切莫辨,對(duì)于RxJava的響應(yīng)式編程的思想是一個(gè)很好地類比洪灯。
從這個(gè)例子中,我們可以抽象出如下的流程
流水線------->操作工1----->操作工2----->.....操作工n-->產(chǎn)品經(jīng)理
這也十分切合響應(yīng)式編程的流程
Observable -> Operator 1 -> Operator 2 -> Operator 3 -> Subscriber
如文中所講白群,產(chǎn)品經(jīng)理很重要尚胞,推動(dòng)了整個(gè)事件的方法,這一點(diǎn)也是RxJava 區(qū)別于傳統(tǒng)的觀察者模式的地方帜慢,沒(méi)有訂閱者(subscriber)時(shí)笼裳,Observeable 是不會(huì)發(fā)送事件的。
作為操作符崖堤,就像流水線上的工人,既要各司其職的完成各種工作耐床,同時(shí)也要保證事件的處理永遠(yuǎn)處于流水線上密幔,這也是RxJava響應(yīng)式編程的關(guān)鍵點(diǎn),“流”的概念撩轰。
在這里胯甩,產(chǎn)品經(jīng)理(Subscriber )也會(huì)完成一些重要的工作,但它希望流水線上的每個(gè)操作工(RxJava的操作符)也能完成一些重要的事情堪嫂,能最大程度的確保產(chǎn)品經(jīng)理已經(jīng)完成的工作不需要再做修改偎箫。
下面結(jié)合一個(gè)簡(jiǎn)單的例子說(shuō)明一下,RxJava中響應(yīng)式編程的優(yōu)點(diǎn)皆串。
RxJava 事件處理###
假設(shè)淹办,現(xiàn)有如下需求,輸出下面數(shù)組中每個(gè)數(shù)與 10 的余數(shù)
List<Integer> numbers = new ArrayList<>();
for (int i = 5; i >= 0; i--) {
numbers.add(i);
}
用RxJava實(shí)現(xiàn)如下:
Observable.from(numbers)
.map(new Func1<Integer, Integer>() {
@Override
public Integer call(Integer integer) {
return 10 % integer;
}
})
.subscribe(new Subscriber<Integer>() {
@Override
public void onCompleted() {
Log.e(MainActivity.class.getSimpleName(), "onCompleted");
}
@Override
public void onError(Throwable e) {
Log.e(MainActivity.class.getSimpleName(), "onError---->" + e.getMessage());
}
@Override
public void onNext(Integer integer) {
Log.e(MainActivity.class.getSimpleName(), "onNext---- >Remainder is " + integer);
}
});
輸出:
可以看到恶复,這里出錯(cuò)了怜森,數(shù)組中有一項(xiàng)為0 速挑,導(dǎo)致了除數(shù)為0,發(fā)生了異常副硅,但是程序并沒(méi)有崩潰姥宝,而是拋出了異常信息。同時(shí)onError方法執(zhí)行了恐疲,而onComplete()方法沒(méi)有執(zhí)行腊满。
我們修復(fù)一下這個(gè)錯(cuò)誤(這里假設(shè)我們無(wú)法修改初始數(shù)據(jù),也就是這里的numbers數(shù)組)
Observable.from(numbers)
.filter(new Func1<Integer, Boolean>() {
@Override
public Boolean call(Integer integer) {
return integer!=0;
}
})
.map(new Func1<Integer, Integer>() {
@Override
public Integer call(Integer integer) {
return 10 % integer;
}
})
.subscribe(new Subscriber<Integer>() {
@Override
public void onCompleted() {
Log.e(MainActivity.class.getSimpleName(), "onCompleted");
}
@Override
public void onError(Throwable e) {
Log.e(MainActivity.class.getSimpleName(), "onError---->" + e.getMessage());
}
@Override
public void onNext(Integer integer) {
Log.e(MainActivity.class.getSimpleName(), "onNext---- >Remainder is " + integer);
}
});
輸出如下:
我們使用RxJava的操作符filter 過(guò)濾掉了0培己,這樣就不會(huì)有錯(cuò)誤碳蛋,最終執(zhí)行了onCompleted方法。
從上面的例子中漱凝,我們得出如下結(jié)論:
- 在一次完整的事件中疮蹦,onNext可能會(huì)執(zhí)行0-n次,而onError() 和 onCompleted()中必有一個(gè)方法會(huì)執(zhí)行茸炒。
- 有異常發(fā)生愕乎,onError就會(huì)調(diào)用
- 訂閱者如果完成了所有事件的處理,onCompleted就會(huì)執(zhí)行壁公,使得我們可以得知整個(gè)事件結(jié)束了
- 操作符不負(fù)責(zé)處理異常感论,而是由訂閱者處理。
這里想一下紊册,按照以往的方式比肄,發(fā)生錯(cuò)誤時(shí),通常是在每個(gè)回調(diào)中處理錯(cuò)誤囊陡。這不僅導(dǎo)致了重復(fù)的代碼芳绩,并且意味著每個(gè)回調(diào)都必須知道如何處理錯(cuò)誤,你的回調(diào)代碼將和調(diào)用者緊耦合在一起撞反。
使用RxJava妥色,Observable對(duì)象根本不需要知道如何處理錯(cuò)誤!操作符也不需要處理錯(cuò)誤狀態(tài)-一旦發(fā)生錯(cuò)誤遏片,就會(huì)跳過(guò)當(dāng)前和后續(xù)的操作符嘹害。所有的錯(cuò)誤處理都交給訂閱者來(lái)做。
但是吮便,這種機(jī)制也不是完美笔呀,有時(shí)候我們可能需要對(duì)不同的錯(cuò)誤做出不同的處理,RxJava的機(jī)制反而不適合了髓需。
這里只是對(duì)響應(yīng)式編程思想的簡(jiǎn)單了解许师!