RxJava的學習旅程(一)

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之間 的關係。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章