原理介紹##
什么是RxJava##
- RxJava 就是異步
- RxJava 的異步實(shí)現(xiàn),是通過一種擴(kuò)展的觀察者模式來實(shí)現(xiàn)的挟憔。
- 一個(gè)響應(yīng)式編程框架
觀察者模式應(yīng)該不陌生,點(diǎn)這里可以重溫一下概念峦失。
RxJava組成###
RxJava最核心的兩個(gè)東西是Observable(被觀察者悴灵,事件源)和Subscriber(觀察者)。
Observable發(fā)出一系列事件擒滑,Subscriber負(fù)責(zé)處理這些事件腐晾。
一個(gè)Observable可以發(fā)出零個(gè)或者多個(gè)事件,直到結(jié)束或者出錯(cuò)丐一。每發(fā)出一個(gè)事件藻糖,就會(huì)調(diào)用它的Subscriber的onNext方法,最后調(diào)用Subscriber.onComplete()或者Subscriber.onError()結(jié)束钝诚。
RxJava相較于傳統(tǒng)的觀察者模式颖御,還有一個(gè)特點(diǎn)榄棵,就是沒有觀察者時(shí)凝颇,主題是不會(huì)發(fā)送事件的。也就說是當(dāng)一個(gè)Observable連一個(gè)Subscriber都沒有時(shí)疹鳄,Observable是不會(huì)發(fā)送事件的拧略。這點(diǎn)和我們上學(xué)時(shí),如果一節(jié)課一個(gè)學(xué)生都沒來聽課的話瘪弓,那么老師也不會(huì)去講課的道理是一樣的垫蛆。
RxJava之Hello world##
RxJava 是一個(gè)方便我們實(shí)現(xiàn)異步的框架。同時(shí)其“響應(yīng)式編程”的思路,對于我們也是一種挑戰(zhàn)袱饭。在加上其各種強(qiáng)大的操作符川无,調(diào)度器也是需要一定的學(xué)習(xí)成本的,姑且就把他當(dāng)做一門“新的語言”虑乖,這里我們就從輸出Hello world說起懦趋。
看到網(wǎng)上的許多教程都使用了Lambda語法進(jìn)行編碼,這個(gè)Lambda雖然很好疹味,但不想在學(xué)習(xí)RxJava的過程中仅叫,增加無畏的難度,所以暫時(shí)不采用糙捺,代碼暫時(shí)能看懂才是最要的诫咱,好看后期再說!
工程導(dǎo)入###
compile 'io.reactivex:rxjava:1.1.7'
compile 'io.reactivex:rxandroid:1.2.1'
完整版Hello World
/**
* 被觀察者洪灯,事件源
*/
private Observable<String> myObserveable;
/**
* 觀察者
*/
private Subscriber<String> mySubscriber;
創(chuàng)建被觀察者
/**
* 創(chuàng)建被觀察者Observable
*/
private void InitObserverr() {
myObserveable = Observable.create(
new Observable.OnSubscribe<String>() {
@Override
public void call(Subscriber<? super String> subscriber) {
subscriber.onNext("hello world");
subscriber.onCompleted();
}
}
);
}
創(chuàng)建觀察者
/**
* 創(chuàng)建觀察者Subscribe
*/
private void InitSubscriber() {
mySubscriber = new Subscriber<String>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(String s) {
Log.e(MainActivity.class.getSimpleName(), "onNext--->" + s);
Toast.makeText(MainActivity.this, s, Toast.LENGTH_SHORT).show();
}
};
}
觀察者訂閱主題(事件源/被觀察者)
myObserveable.subscribe(mySubscriber);
這句代碼按照“字面意思”坎缭,感覺是被觀察者訂閱了觀察者。但實(shí)際上签钩,我們在這里實(shí)現(xiàn)的是觀察者訂閱被觀察者(主題)幻锁。希望不要混淆,并習(xí)慣這個(gè)邏輯边臼。
一旦mySubscriber訂閱了myObservable哄尔,myObservable就會(huì)調(diào)用mySubscriber對象的onNext和onComplete方法,mySubscriber就會(huì)打印出Hello World柠并!這里為了方便測試岭接,同時(shí)Toast了一個(gè)Hello World!
這個(gè)訂閱的實(shí)現(xiàn)臼予,其實(shí)很關(guān)鍵鸣戴。因?yàn)槲覀兦懊嬲f過,在RxJava中粘拾,沒有觀察者時(shí)窄锅,被觀察者是不會(huì)發(fā)布事件的。
用強(qiáng)大的RxJava實(shí)現(xiàn)Hello World的打印缰雇,當(dāng)然不是我們的初衷入偷,這里只是從最基本的用法做出介紹。
精簡版Hello world###
簡化Observable
RxJava內(nèi)置了很多簡化創(chuàng)建Observable對象的函數(shù)械哟,比如Observable.just就是用來創(chuàng)建只發(fā)出一個(gè)事件就結(jié)束的Observable對象疏之,上面創(chuàng)建Observable對象的代碼可以簡化為一行
Observable<String> myObservable = Observable.just("Hello, world!");
簡化Subscribe
有時(shí)候,我們其實(shí)并不關(guān)心OnComplete和OnError暇咆,我們只需要在onNext的時(shí)候做一些處理锋爪,這時(shí)候就可以使用Action1類丙曙。
Action1<String> onNextAction = new Action1<String>() {
@Override
public void call(String s) {
System.out.println(s);
}
};
subscribe 方法
subscribe方法有一個(gè)重載版本,接受三個(gè)Action1類型的參數(shù)其骄,分別對應(yīng)OnNext亏镰,OnComplete, OnError函數(shù)拯爽。
myObservable.subscribe(onNextAction, onErrorAction, onCompleteAction);
這樣為了僅僅輸出一個(gè)Hello World 拆挥,我們拋棄不重要的部分,代碼就可以簡化了:
Observable.just("Hello, world!")
.subscribe(new Action1<String>() {
@Override
public void call(String s) {
System.out.println(s);
}
});
好了某抓,RxJava 基礎(chǔ)用法就到這里了纸兔!