【Android】RxJava的使用(二)Action

回顧

在上一節Android RxJava的使用(一)基本用法中,介紹了RxJava的基本用法。下面來回顧下實現一次RxJava的基本使用。
例:分別打印"Hellow"、" Wrod"

Observable.just("Hello", "World")
                .subscribe(new Subscriber<String>() {
                    @Override
                    public void onCompleted() {

                    }

                    @Override
                    public void onError(Throwable e) {

                    }

                    @Override
                    public void onNext(String s) {
                        Log.i(TAG, s);
                    }
                });

onNext(obj),還有兩個重寫的onError(error)和onCompleted()並沒有用到,這樣導致我們多出了幾行根本用不到的代碼。於是就想能不能只寫我們使用到的,其他幾個沒用到的就不寫,這樣的代碼看着才舒服。接下來就是使用本次的主角Action來代替Subscriber

Action

上部分的代碼使用Action來代替Subscriber得到的代碼是這樣的:

  Observable.just("Hello", "World")
                .subscribe(new Action1<String>() {
                    @Override
                    public void call(String s) {
                        Log.i(TAG, s);
                    }
                });

舒服多了有沒有!!

  • 什麼是Action
    Action是RxJava 的一個接口,常用的有Action0和Action1。

    Action0: 它只有一個方法 call(),這個方法是無參無返回值的;由於 onCompleted() 方法也是無參無返回值的,因此 Action0 可以被當成一個包裝對象,將 onCompleted() 的內容打包起來將自己作爲一個參數傳入 subscribe() 以實現不完整定義的回調。
    Ation1:它同樣只有一個方法 call(T param),這個方法也無返回值,但有一個參數;與 Action0 同理,由於 onNext(T obj) 和 onError(Throwable error) 也是單參數無返回值的,因此 Action1 可以將 onNext(obj)和 onError(error) 打包起來傳入 subscribe() 以實現不完整定義的回調

  • Action的使用
    定義三個對象,分別打包onNext(obj)、onError(error) 、onCompleted()。

    Observable observable = Observable.just("Hello", "World");
          //處理onNext()中的內容
          Action1<String> onNextAction = new Action1<String>() {
              @Override
              public void call(String s) {
                  Log.i(TAG, s);
              }
          };
          //處理onError()中的內容
          Action1<Throwable> onErrorAction = new Action1<Throwable>() {
              @Override
              public void call(Throwable throwable) {
    
              }
          };
          //處理onCompleted()中的內容
          Action0 onCompletedAction = new Action0() {
              @Override
              public void call() {
                  Log.i(TAG, "Completed");
    
              }
          };

    接下來使用subscribe重載的方法

    //使用 onNextAction 來定義 onNext()
    Observable.just("Hello", "World").subscribe(onNextAction);
    //使用 onNextAction 和 onErrorAction 來定義 onNext() 和 onError()
    Observable.just("Hello", "World").subscribe(onNextAction, onErrorAction);
    //使用 onNextAction、 onErrorAction 和 onCompletedAction 來定義 onNext()、 onError() 和 onCompleted()
    Observable.just("Hello", "World").subscribe(onNextAction, onErrorAction, onCompletedAction);

    根據實際情況使用以上的方法處理onNext(obj)、onError(error) 、onCompleted()的回調。
    現在有個疑問,爲什麼使用Action也能達到使用Subscriber的結果?進subscribe(Action1 onNext)的源碼看看。


    RxJava源碼


    還以爲有多高深,原來就是把Action對象轉化成對應的Subscriber對象了。這樣就不難理解爲什麼可以使用Action來代替Subscriber了。

  • 重新寫打印"Hellow"、" Wrod"的方法

    Observable.just("Hellow", "Wrold").subscribe(new Action1<String>() {
              @Override
              public void call(String s) {
                  Log.i(TAG, s);
              }
          });

    相比第一篇那冗長的代碼,現在感覺怎麼樣?還是覺得代碼多?確實,如果只是打印幾個字符串確實還是略微複雜。不急,RxJava還有其他功能呢。

小結

Action的使用爲我們減少了不必要的代碼,使得寫出的代碼看上去更加得簡潔。不過就目前來看RxJava還是沒有什麼優勢值得我們去使用,下一篇我還會介紹更多RxJava的用法。慢慢得,你就會發現使用RxJava寫出來的代碼看上去真的很漂亮。
更多:
更多:
Android RxJava的使用(三)轉換(map、flatMap)
Android RxJava的使用(四)線程控制 —— Scheduler


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