在上一節Android RxJava的使用(一)基本用法中,介紹了RxJava的基本用法。下面來回顧下實現一次RxJava的基本使用。
例:分別打印"Hello"、" World"java
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來代替Subscriberide
上部分的代碼使用Action來代替Subscriber獲得的代碼是這樣的:post
Observable.just("Hello", "World") .subscribe(new Action1<String>() { @Override public void call(String s) { Log.i(TAG, s); } });
舒服多了有沒有!!spa
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() 以實現不完整定義的回調
定義三個對象,分別打包onNext(obj)、onError(error) 、onCompleted()。code
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)的源碼看看。
還覺得有多高深,原來就是把Action對象轉化成對應的Subscriber對象了。這樣就不難理解爲何可使用Action來代替Subscriber了。接口
Observable.just("Hello", "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的使用(四)線程控制 —— Schedulerrem
以上有錯誤之處感謝指出
參考:給 Android 開發者的 RxJava 詳解(本文部份內容引用自該博客)