原文連結
參考文章
在項目gradle中引入
- compile 'io.reactivex:rxjava:1.1.0'
- compile 'io.reactivex:rxandroid:1.1.0'
基礎
- Observable<String> observable = Observable.create(new Observable.OnSubscribe<String>() {
- @Override
- public void call(Subscriber<? super String> subscriber) {
subscriber.onNext("Hello RXJava");
- subscriber.onCompleted();
}
- });
-
- Subscriber<String> subscriber = new Subscriber<String>() {
-
- @Override
- public void onCompleted() {
- Toast.makeText(MainActivity.this, "完成", Toast.LENGTH_LONG).show();
}
-
- @Override
- public void onError(Throwable e) {
-
- }
-
- @Override
- public void onNext(String s) {
Toast.makeText(MainActivity.this, s, Toast.LENGTH_LONG).show(); }
- };
-
- observable.subscribe(subscriber);
這個是最basic的寫法,定義一個釋出者和訂閱者,通過 observable . subscribe ( subscriber ) 将兩者關聯起來, observable 将會調用 subscriber 的 onNext 方法和 onCompleted 方法。 顯然為了列印一句 "Hello RXJava" 要寫這麼多繁瑣的代碼,如何更加簡潔的書寫邏輯呢? RxJava提供了很多函數供我們使用。
- Observable<String> just = Observable.just("你好");
-
- Action1<String> action1 = new Action1<String>() {
-
- @Override
- public void call(String s) {
- Toast.makeText(MainActivity.this, s, Toast.LENGTH_LONG).show();
- }
- };
-
- just.subscribe(action1);
如上, Observable . just 函數就是用來建立隻發送一個事件就結束的 Observable 對象的, subscriber 隻關心 onNext 方法其他兩個方法不關心,是以我們可以使用 new Action1 這個類。最後通過 just . subscribe ( action1 ) 将兩者關聯起來。以上代碼還可以更簡寫:
- Observable.just("你好").subscribe(new Action1<String>() {
- @Override
- public void call(String s) {
- Toast.makeText(MainActivity.this, s, Toast.LENGTH_LONG).show();
- }
- });
變換/操作符 如果現在想在 "你好" 後面加簽名要怎麼做呢? 你可能說直接加上,這樣 "你好,win" 但是這樣真的可以嗎? 假如有多個訂閱者呢?顯然這猴子那個方式不可行。直接這樣 Toast . makeText ( MainActivity . this , s+"win" , Toast . LENGTH_LONG ). show (); 直接加載訂閱者的處理邏輯裡,這樣的話,是可以的,但是這樣寫代碼是不是很累贅呢?一點都不輕量級。如果能在中間的某個步驟進行變換,豈不是最好。那麼操作符應運而生。操作符就是解決 Observable 對象變換的問題的。且RxJava提供了很多操作符。
map:就是把一個事件轉換為另一個事件,操作符就是用于變換 Observable 對象的,它傳回一個 Observable 對象,這樣可以實作鍊式調用,在一個 Observable 上多次使用map操作符,将對簡單的資料傳遞給 subscriber 。
- Observable.just("你好").map(new Func1<String, String>() { //入參是字元串,出參也是字元串
- @Override
- public String call(String s) {
- return s + "+ win";
- }
- }).subscribe(new Action1<String>() {
- @Override
- public void call(String s) {
- Toast.makeText(MainActivity.this, s, Toast.LENGTH_LONG).show();
- }
- });
對象傳回的類型,可以通過map操作符傳回一個新的資料類型的
- Observable.just("map 練習").map(new Func1<String, Integer>() {
- @Override
- public Integer call(String s) {
- return s.hashCode();
- }
- }).subscribe(new Action1<Integer>() {
- @Override
- public void call(Integer Integer) {
- Toast.makeText(MainActivity.this, String.valueOf(Integer), Toast.LENGTH_LONG).show();
- }
- });
之前我們說了map變換将最簡單的資料傳遞給 subscriber ,是以還可以這麼寫
- Observable.just("map 練習").map(new Func1<String, Integer>() {
- @Override
- public Integer call(String s) {
- return s.hashCode();
- }
- }).map(new Func1<Integer, String>() {
- @Override
- public String call(Integer integer) {
- return String.valueOf(integer);
- }
- }).subscribe(new Action1<String>() {
- @Override
- public void call(String s) {
- Toast.makeText(MainActivity.this, s, Toast.LENGTH_LONG).show();
- }
- });
總結 1. Observable 和 subscriber 可以做任何事情 Observable 可以是一個資料庫查詢, subscriber 用來顯示查詢結果; Observable 可以是螢幕上的點選事件, subscriber 用來響應點選事件; Observable 可以是一個網絡請求, subscriber 用來顯示請求結果 。
2. Observable 和 subscriber 是獨立于中間的變換過程的。 在 Observable 和 subscriber 中間可以增減任何數量的map。整個系統是高度可組合的,操作資料是一個很簡單的過程。