1.最近在羣裏聽到最多的就是關於RxJava了,這個框架被很多人看好,是未來技術的主流。聽了那麼多關於RXJAVA的討論,我早已按耐不住學習新技術的心了。雖然我還很菜,android基礎知識都沒玩透。android基本知識通過工作中的問題來學習,理解。課外時間研究下新技術。爭取一年吧rxjava 玩好。
2.推薦文章https://mcxiaoke.gitbooks.io/rxdocs/content/Observables.html RxJava中文教程,這裏面有很多名詞運用的很到位,容易理解,介紹了RxJava的背景,由來,優點,解決什麼問題等等這些引言。值得一看。
剛學習RxJava的時候,真的是搞不懂,建議先看看設計模式之觀察者模式。我的博客中也有,舉 的那個例子真心不錯,可以看看。
今天主要記錄的問題是。Observable(被觀察者),Subscriber(觀察者),OnSubscribe(訂閱)。
先看一個demo:
這是一個被觀察者創建的代碼,通過靜態方法create(onSubScribe)來實例化一個被觀察者。
Observable <String>myObservable=Observable.create(onSubscribe);
"訂閱"對象的實例化:
Observable.OnSubscribe<String>onSubscribe=new Observable.OnSubscribe<String>() {
@Override
public void call(Subscriber<? super String> subscriber) {
Toast.makeText(MainActivity.this, "hello Rxjava", Toast.LENGTH_SHORT).show();
}
};
觀察者代碼的實例化:
Subscriber<String> mySubscriber = new Subscriber<String>() {
@Override
public void onNext(String s) {
Log.d("4577155", "Hello Rxjava");
}
@Override
public void onCompleted() { }
@Override
public void onError(Throwable e) { }
};
之後調用obervable.subscribe(subscriber);將觀察者和被觀察者綁定在一起。這就是rxjava的組成部位了。包括三大塊:訂閱,觀察者,和被觀察者。
觀察者的實例化需要實現3個方法:分別是onnext,oncompleted,onerror方法。官方中文文檔給的解釋如下:
onNext(T item): Observable調用這個方法發射數據,方法的參數就是Observable發射的數據,這個方法可能會被調用多次,取決於你的實現。
onError(Exception ex):當Observable遇到錯誤或者無法返回期望的數據時會調用這個方法,這個調用會終止Observable,後續不會再調用onNext和onCompleted,onError方法的參數是拋出的異常。
onComplete:正常終止,如果沒有遇到錯誤,Observable在最後一次調用onNext之後調用此方法。根據Observable協議的定義,onNext可能會被調用零次或者很多次,最後會有一次onCompleted或onError調用(不會同時),傳遞數據給onNext通常被稱作發射,onCompleted和onError被稱作通知。
rxjava 中文學習文檔有幾個概念很重要,值得我反覆的閱讀,揣摩。
1.觀察者需要通過訂閱與被觀察者關聯起來。
2.繼續你的業務邏輯,等待方法返回結果,被觀察者發射結果,觀察者接收並且處理結果。
在剛開始學習的時候,我很困惑,不知道rxjava的代碼風格爲什麼會是這樣。不懂之間的調用關係。好在rxjava源碼給寫的通俗易懂,我這個菜鳥就能懂。接下來我來分析下源碼。直接從下面這段代碼開始查看源碼:
obervable.subscribe(subscriber)
查看源碼:看清楚subscribe(subscriber <T>subscriber)這個方法實際上是調用了。ObServable(被觀察者)的靜態方法subscribe().注意這個方法傳遞的參數是:觀察者和被觀察者。
我們繼續查看Observable.subscribe(subscriber,this)這個方法的源代碼:
其中核心代碼就是這條了:
hook這個類是啥意思我也不清楚,不過不妨礙我們繼續分析。hook.onSubscribestart(),這個方法 返還回來的是一個“訂閱”對象,也就是observable.OnSubscribe。在通過查閱代碼看看OnSubscribe裏面咋寫的。
這句話很有意思:當observable.subscribe(Subscriber)這個綁定方法被調用的時候,"訂閱"對象將會調用它的call方法。注意call方法裏面傳遞的參數 就是我們的“觀察者”。也就是observable.subscribe(Subscriber)這個方法的參數。。。寫在這裏 我突然對onnext()方法的解釋產生質疑。感覺應該是Subscriber調用onnext接收處理數據。不知道是不是翻譯過來出問題了。
總結下:這個demo運行的流程:首先實例化Observable對象,onSubscribe對象(訂閱)以及subscribe(觀察者)對象。然後調用subscribe(),方法綁定觀察者和被觀察者。
綁定了之後,通過一些列的代碼最終會執行到 onSubscribe.call(Subscriber)這個方法。在這個call方法裏面我們可以調用觀察者的onnext,oncompleted。onerror方法。
下面我來驗證下是不是這麼個流程:
看API我們知道 Observable的初始化,也可以通過如下的代碼來創建一個Observable對象。
Observable<String> myObservable = Observable.just("Hello, world!");
Action1<String> action1=new Action1<String>() {
@Override
public void call(String s) {
}
};
myObservable.subscribe(action1);
這個demo和上面給的那種方式的demo最終運行效果是一樣的。
但是很明顯Subscriber,明顯被Action1對象取代了。
查看Action1接口發現:
這個Action1接口裏面就是一個call方法。
我們在通過查看myObservable.subscriber(Action1).這個方法的源碼。看下里面是怎麼運作的。
相當於myObservable.subscriber(Action1).這條代碼等價於myObservable.subscriber(Subscriber)這條代碼。.
博客寫在這裏的時候,我自己就有一個疑問,根據我們上面的結論 必須先調用“訂閱對象的call方法”,然後觀察者在訂閱對象的call方法中調用onnext方法。但是實際運行結果是能彈出一句話。。但是我並沒有在代碼中看到對Onsubscribe(訂閱)的賦值啊,我的影像中這個對象爲null。纔對爲毛還是可以呢。
最後我查看了observable.just創建方法。發現了
系統內部創建了一個OnSubscribe方法,並且在call裏面執行了onnext方法,。最終發現通過Action的流程和我上面分析的也是吻合的。不過話說回來。這裏的Action1的作用價值體現在哪呢。
最後根據變量命名分析:原來action在這裏就是等與onNext的,觀察者裏面的onNext方法執行的是 Action1.call(T t)...系統那把這個Action1的變量命名爲onNext.,說明Action1,對象通過call方法。來處理接收到的數據。
這些都是我今晚的理解,又不對的地方請指出。大概算是明白了Subscribe,observable,和onSubscribe之間 的關係。