
前言
以前寫相關(guān)的RxJava的文章比較少,也就下面二篇:
用了這么久的RxJava,所以想要做個(gè)總結(jié),所以打算也寫一個(gè)RxJava源碼分析 的系列(所以不是簡(jiǎn)單的說(shuō)明如何使用RxJava步驟,看之前也最好會(huì)使用RxJava):
Android技能樹(shù) - Rxjava源碼系列(1) 之 初步結(jié)構(gòu)
Android技能樹(shù) - Rxjava源碼系列(2) 之 Observable和Observer(待寫)
Android技能樹(shù) - Rxjava源碼系列(3) 之 線程切換(待寫)
Android技能樹(shù) - Rxjava源碼系列(4) 之 常用操作符(待寫)
正文
我們還是通過(guò)基礎(chǔ)的例子來(lái)進(jìn)行講解,比如你有個(gè)快遞,你很想知道快遞是否已經(jīng)到小區(qū),你可能想要在快遞剛到你的小區(qū)的時(shí)候就馬上知道,然后馬上就能享受拆快遞所帶來(lái)的樂(lè)趣,畢竟等待快遞的時(shí)候?qū)嵲谔灏玖恕?/strong>
那我們有什么方式來(lái)確定快遞是否到了小區(qū)呢?
1. 輪詢 和 更新發(fā)送
1.1 輪詢
我們可以每隔1分鐘,就打個(gè)電話給快遞小哥,問(wèn)他我的快遞是不是已經(jīng)送到了,這樣當(dāng)快遞小哥剛送貨到你的小區(qū)的時(shí)候,你都最多能在不超過(guò)一分鐘內(nèi)知道快遞已經(jīng)到小區(qū)了。(缺點(diǎn)也很明顯,電話費(fèi)很貴,同時(shí)你不怕小哥打死你的話,你也可以用這種方式)
1.2 更新發(fā)送
當(dāng)快遞小哥把快遞送到你的小區(qū)的時(shí)候,一般都是二種方式:1. 他可能直接打你的電話通知你下來(lái)拿快遞;2. 統(tǒng)一放在快遞貨柜中,然后你會(huì)收到貨柜的短信通知,根據(jù)開(kāi)柜號(hào)碼去拿快遞。
明顯這種數(shù)據(jù)更新后主動(dòng)通知的方式,我們更容易接受,大家都開(kāi)心,小哥也不會(huì)打死你。但是上面我們也說(shuō)了快遞小哥通知你的方式有二種:<font color = red>直接通知你/貨柜接收快遞,貨柜再通知你</font>
快遞員到了小區(qū)后,通知你的二種方式又分別對(duì)應(yīng)了什么模式?
2.觀察者模式和發(fā)布訂閱模式
我們上面已經(jīng)提到了快遞小哥到了你小區(qū),有二種方式通知你,其實(shí)這里對(duì)應(yīng)了 觀察者模式和發(fā)布訂閱模式這二種模式。其實(shí)我以前也總是把這二個(gè)模式弄混,感覺(jué)都差不多,所以在和別人討論的時(shí)候都是混著說(shuō)著這個(gè)名詞,后來(lái)看了網(wǎng)上相關(guān)的文章,發(fā)現(xiàn)這二者還是有點(diǎn)不同的,正對(duì)應(yīng)了上面你收到快遞的信息一樣的區(qū)別。
2.1 觀察者模式
對(duì)應(yīng)的就是我們的快遞員把快遞送到了小區(qū)后,直接打電話給你,說(shuō)你快下來(lái)拿下快遞;這時(shí)候快遞員是直接跟你本人直接溝通的
2.2 發(fā)布訂閱模式
對(duì)應(yīng)的就是我們的快遞員把快遞送到小區(qū)后,把快遞放在快遞柜中,然后快遞員只要把你的手機(jī)號(hào)碼輸入到快遞柜,然后把快遞放入到具體的某個(gè)快遞柜的格子中,就可以直接走人了,等會(huì)會(huì)由快遞柜這邊通知你快遞到了,然后過(guò)來(lái)取快遞。
二者最大的區(qū)別是什么?
我直接引用網(wǎng)上的其他文章的內(nèi)容:兩種模式都存在訂閱者和發(fā)布者(具體觀察者可認(rèn)為是訂閱者、具體目標(biāo)可認(rèn)為是發(fā)布者),但是觀察者模式是由具體目標(biāo)調(diào)度的,而發(fā)布/訂閱模式是統(tǒng)一由調(diào)度中心調(diào)的,所以觀察者模式的訂閱者與發(fā)布者之間是存在依賴的,而發(fā)布/訂閱模式則不會(huì)。
那RxJava是屬于上面的二種的哪一種呢?
我們直接看GitHub上的RxJava介紹:
看不懂的我們直接谷歌翻譯走起:
我們可以看到介紹,說(shuō)是擴(kuò)展了觀察者模式,所以說(shuō)明我們的Rxjava是直接把觀察者注冊(cè)到了發(fā)布者。而沒(méi)有中間的調(diào)度中心。所以也就是我們上面的快遞員直接打電話通知你下來(lái)拿快遞的方式。
3.Rxjava的具體分析
我們使用RxJava最基礎(chǔ)的方式是什么?
我們剛開(kāi)始學(xué)如何使用的時(shí)候,估計(jì)百分之99的都是先學(xué)會(huì)使用create操作符:
Observable.create(new ObservableOnSubscribe<Object>() {
@Override
public void subscribe(ObservableEmitter<Object> emitter) throws Exception {
}
}).subscribe(new Observer<Object>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(Object o) {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
}
});
其實(shí)這個(gè)最基礎(chǔ)的了解了后,看其他的什么just,fromArray等就都理解了;當(dāng)然我們既然是RxJava系列的第一篇初步結(jié)構(gòu),所以我也不會(huì)馬上就講解各種源碼,我們可以先模仿一個(gè)簡(jiǎn)單的,比如:
Observable.just(1)
.subscribe(new Observer<Integer>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(Integer integer) {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
}
});
我們可以這樣先模仿這個(gè)簡(jiǎn)單的,寫個(gè)效果一樣的偽代碼,了解一下基本的東西即可。
所以如果我們寫了一個(gè)簡(jiǎn)單的版本的RxJava應(yīng)該是這樣的:
Observer.java:
public class Observer<T> {
@Override
public void onSubscribe(Disposable d) {
}
public void onNext(T obj) {
}
public void onError(Throwable e) {
}
public void onComplete() {
}
}
Observable.java:
public class Observable<T> {
T value;
Observer<? super T> observer;
//just傳進(jìn)來(lái)的數(shù)值,等會(huì)要發(fā)送給Observer
public void just(T value) {
this.value = value;
}
public final void subscribe(Observer<? super T> observer) {
//把Observer注冊(cè)到Observable中,其實(shí)就等于Observable拿了Observer的對(duì)象,等會(huì)好調(diào)用它相應(yīng)的方法
this.observer = observer;
//生成Disposable對(duì)象,調(diào)用observer的onSubscribe方法
Disposable a = xxxxxxx;
observer.onSubscribe(a);
//我們已經(jīng)拿到了Observer對(duì)象,可以做相關(guān)邏輯了
start();
}
private void start() {
try {
//我們把just傳進(jìn)的數(shù)值,通過(guò)已經(jīng)拿到的Observer對(duì)象,調(diào)用onNext把數(shù)值給它
observer.onNext(value);
//發(fā)送完了之后執(zhí)行onComplete()方法說(shuō)明結(jié)束了。
observer.onComplete();
} catch (Exception e) {
//如果中間出現(xiàn)異常,就調(diào)用Observer的onError方法
observer.onError(e);
}
}
}
是不是感覺(jué),臥槽,原來(lái)這么簡(jiǎn)單嗎?沒(méi)錯(cuò),這樣看來(lái)我們也的確是Observable直接持有了Observer的對(duì)象,也的確符合上面我們說(shuō)的Rxjava使用的是觀察者模式,而不是發(fā)布訂閱模式。
所以現(xiàn)在初步來(lái)看RxJava目前來(lái)看三步走:
結(jié)語(yǔ)
因?yàn)橹皇堑谝黄醪浇Y(jié)構(gòu),所以內(nèi)容也十分簡(jiǎn)單,后續(xù)會(huì)具體分析相關(guān)的源碼內(nèi)容。