Retrofit和Rxjava結合實踐(二)--Rxjava快速理解

上一篇我們介紹了Retrofit,這次我們來了解一下Rxjava。

Rxjava的概念和使用,如果鋪開來講,可以講很長,同上一篇一樣,我不打算把這篇博客寫成一個技術索引,或者大全,我只是希望能讓初學者能夠拋開那些複雜的概念(在Rxjava中,你能看到各種讓初學者頭大的名詞,諸如響應式編程,調度器,訂閱者,觀察者等等),對Rxjava有一個基礎的認識,同時知道如何在代碼中使用它。

ps:關於響應式編程,我也所知甚少,有機會我會專門寫一篇博客來介紹它。

一. 什麼是Rxjava
首先,Rxjava的模式,基本上就是觀察者模式(很抱歉我沒辦法不提這個概念),但是你不需要理解觀察者模式是什麼。
如果你是一個android開發者,你應該知道view的一個函數setOnClickListener(),這就是典型的一個觀察者模式。當你想要觀察一個view(比如一個button)的行爲時,你會聲明一個OnClickListener,然後通過setOnClickListener()方法,把這個view跟OnClickListener關聯起來,這樣,每當view被點擊的時候,OnClickListener都會得知。

Rxjava也是這樣,它有一個觀察者Observer,一個被觀察者Observable,還有一個方法subscribe用來將兩者聯繫起來。

但是,其實我們忽略了另外一個要素:事件。
在上面的OnClickListener的例子裏面,實際上是隱藏着一個事件的,這個事件就是”點擊”,因爲OnClickListener只能處理點擊事件,所以沒有必要特別說明。
但是Rxjava可以處理所有事件,被觀察者Observable發出的任何事件,都會通知給觀察者Observer。
這個事件可能是任何東西,比如它可能是一個字符串(最簡單的場景),也可能是一個網絡請求(Rxjava最常用的場景),或者別的什麼。

那麼代碼看起來應該是這樣的:

//聲明一個觀察者
Observer observer = new Observer();
//同時定義觀察者收到事件後的反應
observer.handleEvent(){
    @Override
    public void whenGetEvent() {
        //TODO
    }};

//聲明一個被觀察者
Observable observable = new Observable();
//同時爲被觀察者添加一個可被觀察到的事件
observable.createEvent(new Event());

//綁定觀察者和被觀察者
Observable.subscribe(Observer);

上面都是僞代碼(都是假的!!),看上去很扯,但是基本上表達了Rxjava的流程。

其實看起來很複雜的Rxjava,寫到這裏大家就可以使用了。。。
上面的代碼,我給大家寫一下真正的代碼:

//一樣的,創建一個觀察者,並定義觀察者收到事件後的反應
//但是與之前我們的僞代碼不同的是,這裏觀察者可以定義三種行爲,分別是下一個事件發生時,所有事件結束時還有出錯時。這裏其實還隱藏着一個概念,那就是觀察者不只是可以接受一個事件,它還可以接受一組事件
Observer<String> observer = new Observer<String>() {
    @Override
    public void onNext(String s) {
        Log.d(tag, "Item: " + s);
    }

    @Override
    public void onCompleted() {
        Log.d(tag, "Completed!");
    }

    @Override
    public void onError(Throwable e) {
        Log.d(tag, "Error!");
    }
};

//然後定義一個被觀察者,同時定義它可被觀察的事件
//這裏,我們的事件很簡單,就是傳3個字符串給觀察者
Observable observable = Observable.create(new Observable.OnSubscribe<String>() {
    @Override
    public void call(Observer<? super String> observer) {
        observer.onNext("string one");
        observer.onNext("string two");
        observer.onNext("string three");
        observer.onCompleted();
    }
});

//最後,綁定觀察者和被觀察者
Observable.subscribe(Observer);

總結一下,對於觀察者來說,它比我們預想的要強大,因爲它可以觀察到更多的事件,還能觀察到事件的結束和出錯。這對我們來說是非常有用的,想象一下,如果我們需要發送2個http請求並接受返回數據,展示到UI中(當然,不建議這麼做),那我們現在只需要一個觀察者就可以搞定了
而對於被觀察者來說,我認爲這部分纔是rxjava的難點所在,我們只是舉了一個非常非常簡單的例子。而在實際使用中,有大量的被觀察者事件可以爲我們所用。

Observable有非常多的方法可供我們選擇,但是我並不想把它們寫在這裏。這樣的話,我的這篇博客就跟一篇使用說明差不多了。這是一個很糾結的事情,不把方法羅列出來,就無法說明rxjava的強大,羅列出來,又違背了我的初衷。。。

最終我還是不打算羅列方法,而是給大家再次推薦這篇博客:
http://gank.io/post/560e15be2dca930e00da1083

如果想了解rxjava,一定不能錯過這篇文章。

而我接下去,想說一下爲何我們要使用rxjava。
rxjava並不能減少你的代碼行數。注意,我沒有說代碼量,而是說的代碼行數。它甚至一定程度上會增加你的代碼行數。
但是,rxjava可以減少你的代碼邏輯量。這聽起來很扯淡,但是確實如此:
rxjava通過線性的事件分割,來減少我們的代碼複雜度。其實這在我們現實生活中也是如此。比如製作火箭,這聽起來非常非常非常複雜。如果我們要把它作爲一個事件來處理,絕大多數人都會覺得這無法實現。
而如果我們把這個事件分割,比如分割成製作火箭的燃料,製作火箭的金屬,拼裝火箭幾步(好吧,看起來仍是不可實現的。。。),那它看起來起碼是有的放矢了。
rxjava就是通過各種方法,來幫我們分割了這些事件,隨着分割粒度的細化,我們也可以達到部分代碼的複用。

以上就是這篇博客的全部了,我知道這次寫得比較晦澀,如有問題,歡迎大家來探討。

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