我理解的RxJava

一.前言

1.lz身爲一個程序員擼了大概倆年代碼了把,同時身爲大學生自己也做過幾個項目,跟着老師也做了幾個小項目,由JavaWeb學到Android再到linux入門,有時候接觸多了真的覺得前期項目的結構超級超級重要,所以花了一段時間查找跟架構有關的資料,以前就聽說過RxJava,可是沒怎麼關注,最近就開始研究,相關的參考資料:
架構相關:
知乎:Android項目開發如何設計整體架構?
https://www.zhihu.com/question/45517397
【譯】Android應用架構
http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/1214/3772.html
RxJava相關資料:
當然是大頭鬼的:
http://blog.csdn.net/lzyzsd/article/details/41833541
還有大頭鬼整理出來的RxJava相關的資料:
https://github.com/lzyzsd/Awesome-RxJava(強力推薦以第一篇來入門)

二.開始我的RxJava之旅

爲什麼用RxJava
看了上面我推薦的關於架構的文章,可能你已經知道我爲什麼會去關注RxJava了。通俗的講,RxJava就是一種模式:高級觀察者模式
何謂高級觀察者模式呢,口頭上講就是:我等你,如果我等到你,我就讓你嘿嘿嘿;作爲一名程序員肯定用過setOnClickListener這些監聽回調,但是有時候邏輯太複雜就會然後這些監聽一層嵌套一層,這裏我先舉個例子:
eg:我要進入某個頁面,在進入之前必須先判斷當前是否登錄,如果未登錄,就彈出dialog,如果點擊確定,就跳到登錄頁面,當登錄完成後再跳到最開始想要進入的那個頁面,如果點擊了dialog的取消,就要彈出一個提示框,提示未登錄無法進入
相信大家也可以想象得到如果上面這段邏輯用回調實現的時候,那個代碼是有多恐怖,也就是Callback Hell(回調地獄).
那使用RxJava是怎麼實現的呢?
RxJava可以讓你代碼實現流水線方式解決問題,雖然還是免不了嵌套,但是大大減少了嵌套的層數,讓代碼更加結構化和更加簡潔
總結起來,RxJava的優點:

  1. 讓整體項目更有結構性,每一層有每一層該做的事,減少層與層之間的耦合,通過一個數據驅動器來分發數據和管理數據
  2. 大量的減少ui層的代碼量
  3. 優化多重嵌套
  4. 總之很多很多好處

三.Rx簡單入門

1.概念
概念這東西其實很簡單,從本質上去理解RxJava,其實也就是一個觀察者A,一個被觀察者B,然後每當A去觀察B,B就會去調用某個方法,然後結果返回給A.
當然,這只是簡單化的理解,在真實的應用中,A與B中間隔了很多個方法,這些方法包括類型的轉換,異常的捕捉等等,這些後面會講到
2.如何完成一個流程
創建一個被觀察者myObservable,最簡單地方式,就是直接調用create()

Observable<String> myObservable = Observable.create(  
    new Observable.OnSubscribe<String>() {  
        @Override  
        public void call(Subscriber<? super String> sub) {  
            //sub就是觀察者,發送一個字符串
            sub.onNext("Hello, world!");  
            sub.onCompleted();  
        }  
    }  
); 

然後創建一個被觀察者Subscriber來處理Observable對象發出的字符串

Subscriber<String> mySubscriber = new Subscriber<String>() {  
    @Override  
    public void onNext(String s) { System.out.println(s); }  

    @Override  
    public void onCompleted() { }  

    @Override  
    public void onError(Throwable e) { }  
};

創建觀察者Subscriber需要實現三個方法:

  1. onNext(String s) 就是被觀察者做完一件事會調用的
  2. onCompleted() 當所有事件完成後調用
  3. onError(Throwable e) 當被觀察者發生異常的時候,可以通過return Observation.error(Exception),把異常返回給觀察者由觀察者來決定怎麼處理

觀察者與被觀察者的綁定

myObservable.subscribe(mySubscriber);  

一旦mySubscriber訂閱了myObservable,myObservable就是調用mySubscriber對象的onNext和onComplete方法,mySubscriber就會打印出Hello World!

3.優化
當然上面只是最基本的創建觀察者與被觀察者之間聯繫的最簡單方式,作爲一個成熟的框架,然後有更簡單地方法去實現這倆者之間的關係
創建一個被觀察者:

Observable<String> myObservable = Observable.just("Hello, world!");

可能初學者看到just()函數會比較萌萌噠,我的理解方式就是創建一個被觀察者,只發出一個事件,其他的我不管,然後接下來你只需接收這個觀察者然後處理傳過來的String變量就行(泛型)

當你不關心異常,或者說你已經在中間環節處理了異常的時候,你可以嘗試用下:

Action1<String> onNextAction = new Action1<String>() {  
    @Override  
    public void call(String s) {  
        System.out.println(s);  
    }  
};  

這就是一個最簡單地觀察者,只做onNext裏面的操作,只需要把這個onNextAction 傳到subscribe()函數裏面就行
綜合以上倆點,可以寫成:

Observable.just("Hello, world!")  
    .subscribe(new Action1<String>() {  
        @Override  
        public void call(String s) {  
              System.out.println(s);  
        }  
    }); 

4.功能加強
看完上面的,你可能還完全體會不到RxJava的好處,只會覺得功能很簡單,很多東西有侷限性完成不了你想要的邏輯。上面我提到了RxJava裏面可以在中間環節添加操作,什麼意思呢?
就是你可以隨意對被觀察者返回的數據進行操作再返回給觀察者,還可以有目的地指定哪個操作運行在哪個線程,這裏就要用到RxJava的操作符
比如map操作符,用於做Observable對象的變換,通俗一點講,就是在可以改變傳遞的數據的類型

Observable.just("Hello, world!")  
    .map(new Func1<String, Integer>() {  
        @Override  
        public Integer call(String s) {  
            return s.hashCode();  
        }  
    })  
    .subscribe(i -> System.out.println(Integer.toString(i))); 

一開始被觀察者返回的數據類型是String,通過map操作符,最終傳遞到觀察者的數據類型是int,當然,操作符是支持多次調用的,所以可以更加線性地去處理我我們的每個邏輯
關於操作符的更多瞭解,請參考大頭鬼的:
深入淺出RxJava(二:操作符)
http://blog.csdn.net/lzyzsd/article/details/44094895
你需要了解更多操作符,才能讓你寫代碼的時候更加行雲流水

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