前言
以前寫相關的RxJava的文章比較少,也就下面二篇:
用了這麼久的RxJava,所以想要做個總結,所以打算也寫一個RxJava原始碼分析 的系列(所以不是簡單的說明如何使用RxJava步驟,看之前也最好會使用RxJava):
Android技能樹 - Rxjava原始碼系列(1) 之 初步結構
Android技能樹 - Rxjava原始碼系列(2) 之 Observable和Observer(待寫)
Android技能樹 - Rxjava原始碼系列(3) 之 執行緒切換(待寫)
Android技能樹 - Rxjava原始碼系列(4) 之 常用操作符(待寫)
正文
我們還是通過基礎的例子來進行講解,比如你有個快遞,你很想知道快遞是否已經到小區,你可能想要在快遞剛到你的小區的時候就馬上知道,然後馬上就能享受拆快遞所帶來的樂趣,畢竟等待快遞的時候實在太煎熬了。
那我們有什麼方式來確定快遞是否到了小區呢?
1. 輪詢 和 更新傳送
1.1 輪詢
我們可以每隔1分鐘,就打個電話給快遞小哥,問他我的快遞是不是已經送到了,這樣當快遞小哥剛送貨到你的小區的時候,你都最多能在不超過一分鐘內知道快遞已經到小區了。(缺點也很明顯,電話費很貴,同時你不怕小哥打死你的話,你也可以用這種方式)
1.2 更新傳送
當快遞小哥把快遞送到你的小區的時候,一般都是二種方式:1. 他可能直接打你的電話通知你下來拿快遞;2. 統一放在快遞貨櫃中,然後你會收到貨櫃的簡訊通知,根據開櫃號碼去拿快遞。
明顯這種資料更新後主動通知的方式,我們更容易接受,大家都開心,小哥也不會打死你。但是上面我們也說了快遞小哥通知你的方式有二種:直接通知你/貨櫃接收快遞,貨櫃再通知你
快遞員到了小區後,通知你的二種方式又分別對應了什麼模式?
2.觀察者模式和釋出訂閱模式
我們上面已經提到了快遞小哥到了你小區,有二種方式通知你,其實這裡對應了 觀察者模式和釋出訂閱模式這二種模式。其實我以前也總是把這二個模式弄混,感覺都差不多,所以在和別人討論的時候都是混著說著這個名詞,後來看了網上相關的文章,發現這二者還是有點不同的,正對應了上面你收到快遞的資訊一樣的區別。
2.1 觀察者模式
對應的就是我們的快遞員把快遞送到了小區後,直接打電話給你,說你快下來拿下快遞;這時候快遞員是直接跟你本人直接溝通的
2.2 釋出訂閱模式
對應的就是我們的快遞員把快遞送到小區後,把快遞放在快遞櫃中,然後快遞員只要把你的手機號碼輸入到快遞櫃,然後把快遞放入到具體的某個快遞櫃的格子中,就可以直接走人了,等會會由快遞櫃這邊通知你快遞到了,然後過來取快遞。
二者最大的區別是什麼?
我直接引用網上的其他文章的內容:兩種模式都存在訂閱者和釋出者(具體觀察者可認為是訂閱者、具體目標可認為是釋出者),但是觀察者模式是由具體目標排程的,而釋出/訂閱模式是統一由排程中心調的,所以觀察者模式的訂閱者與釋出者之間是存在依賴的,而釋出/訂閱模式則不會。
那RxJava是屬於上面的二種的哪一種呢?
我們直接看GitHub上的RxJava介紹:
看不懂的我們直接谷歌翻譯走起:
我們可以看到介紹,說是擴充套件了觀察者模式,所以說明我們的Rxjava是直接把觀察者註冊到了釋出者。而沒有中間的排程中心。所以也就是我們上面的快遞員直接打電話通知你下來拿快遞的方式。
3.Rxjava的具體分析
我們使用RxJava最基礎的方式是什麼?
我們剛開始學如何使用的時候,估計百分之99的都是先學會使用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() {
}
});
複製程式碼
其實這個最基礎的瞭解了後,看其他的什麼just,fromArray
等就都理解了;當然我們既然是RxJava系列的第一篇初步結構,所以我也不會馬上就講解各種原始碼,我們可以先模仿一個簡單的,比如:
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() {
}
});
複製程式碼
我們可以這樣先模仿這個簡單的,寫個效果一樣的虛擬碼,瞭解一下基本的東西即可。
所以如果我們寫了一個簡單的版本的RxJava應該是這樣的:
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傳進來的數值,等會要傳送給Observer
public void just(T value) {
this.value = value;
}
public final void subscribe(Observer<? super T> observer) {
//把Observer註冊到Observable中,其實就等於Observable拿了Observer的物件,等會好呼叫它相應的方法
this.observer = observer;
//生成Disposable物件,呼叫observer的onSubscribe方法
Disposable a = xxxxxxx;
observer.onSubscribe(a);
//我們已經拿到了Observer物件,可以做相關邏輯了
start();
}
private void start() {
try {
//我們把just傳進的數值,通過已經拿到的Observer物件,呼叫onNext把數值給它
observer.onNext(value);
//傳送完了之後執行onComplete()方法說明結束了。
observer.onComplete();
} catch (Exception e) {
//如果中間出現異常,就呼叫Observer的onError方法
observer.onError(e);
}
}
}
複製程式碼
是不是感覺,臥槽,原來這麼簡單嗎?沒錯,這樣看來我們也的確是Observable直接持有了Observer的物件,也的確符合上面我們說的Rxjava使用的是觀察者模式,而不是釋出訂閱模式。
所以現在初步來看RxJava目前來看三步走:
結語
因為只是第一篇初步結構,所以內容也十分簡單,後續會具體分析相關的原始碼內容。