天天看點

深入淺出RxJava—基礎篇

原文連結

參考文章

在項目gradle中引入 

  1. compile 'io.reactivex:rxjava:1.1.0'
  2. compile 'io.reactivex:rxandroid:1.1.0'

基礎

  1. Observable<String> observable = Observable.create(new Observable.OnSubscribe<String>() {
  2. @Override
  3. public void call(Subscriber<? super String> subscriber) { subscriber.onNext("Hello RXJava");
  4. subscriber.onCompleted(); }
  5. });
  6. Subscriber<String> subscriber = new Subscriber<String>() {
  7. @Override
  8. public void onCompleted() {
  9. Toast.makeText(MainActivity.this, "完成", Toast.LENGTH_LONG).show(); }
  10. @Override
  11. public void onError(Throwable e) {
  12. }
  13. @Override
  14. public void onNext(String s) { Toast.makeText(MainActivity.this, s, Toast.LENGTH_LONG).show(); }
  15. };
  16. observable.subscribe(subscriber);

這個是最basic的寫法,定義一個釋出者和訂閱者,通過 observable . subscribe ( subscriber )   将兩者關聯起來, observable  将會調用 subscriber  的 onNext 方法和 onCompleted 方法。 顯然為了列印一句 "Hello RXJava"  要寫這麼多繁瑣的代碼,如何更加簡潔的書寫邏輯呢? RxJava提供了很多函數供我們使用。 

  1. Observable<String> just = Observable.just("你好");
  2. Action1<String> action1 = new Action1<String>() {
  3. @Override
  4. public void call(String s) {
  5. Toast.makeText(MainActivity.this, s, Toast.LENGTH_LONG).show();
  6. }
  7. };
  8. just.subscribe(action1);

如上, Observable . just  函數就是用來建立隻發送一個事件就結束的 Observable  對象的, subscriber   隻關心 onNext  方法其他兩個方法不關心,是以我們可以使用 new Action1  這個類。最後通過 just . subscribe ( action1 ) 将兩者關聯起來。以上代碼還可以更簡寫:

  1. Observable.just("你好").subscribe(new Action1<String>() {
  2. @Override
  3. public void call(String s) {
  4. Toast.makeText(MainActivity.this, s, Toast.LENGTH_LONG).show();
  5. }
  6. });

變換/操作符 如果現在想在 "你好"  後面加簽名要怎麼做呢? 你可能說直接加上,這樣  "你好,win"  但是這樣真的可以嗎? 假如有多個訂閱者呢?顯然這猴子那個方式不可行。直接這樣 Toast . makeText ( MainActivity . this , s+"win" , Toast . LENGTH_LONG ). show ();  直接加載訂閱者的處理邏輯裡,這樣的話,是可以的,但是這樣寫代碼是不是很累贅呢?一點都不輕量級。如果能在中間的某個步驟進行變換,豈不是最好。那麼操作符應運而生。操作符就是解決 Observable  對象變換的問題的。且RxJava提供了很多操作符。

map:就是把一個事件轉換為另一個事件,操作符就是用于變換 Observable  對象的,它傳回一個 Observable  對象,這樣可以實作鍊式調用,在一個 Observable  上多次使用map操作符,将對簡單的資料傳遞給 subscriber  。

  1. Observable.just("你好").map(new Func1<String, String>() { //入參是字元串,出參也是字元串
  2. @Override
  3. public String call(String s) {
  4. return s + "+ win";
  5. }
  6. }).subscribe(new Action1<String>() {
  7. @Override
  8. public void call(String s) {
  9. Toast.makeText(MainActivity.this, s, Toast.LENGTH_LONG).show();
  10. }
  11. });

 對象傳回的類型,可以通過map操作符傳回一個新的資料類型的

  1. Observable.just("map 練習").map(new Func1<String, Integer>() {
  2. @Override
  3. public Integer call(String s) {
  4. return s.hashCode();
  5. }
  6. }).subscribe(new Action1<Integer>() {
  7. @Override
  8. public void call(Integer Integer) {
  9. Toast.makeText(MainActivity.this, String.valueOf(Integer), Toast.LENGTH_LONG).show();
  10. }
  11. });

之前我們說了map變換将最簡單的資料傳遞給 subscriber  ,是以還可以這麼寫

  1. Observable.just("map 練習").map(new Func1<String, Integer>() {
  2. @Override
  3. public Integer call(String s) {
  4. return s.hashCode();
  5. }
  6. }).map(new Func1<Integer, String>() {
  7. @Override
  8. public String call(Integer integer) {
  9. return String.valueOf(integer);
  10. }
  11. }).subscribe(new Action1<String>() {
  12. @Override
  13. public void call(String s) {
  14. Toast.makeText(MainActivity.this, s, Toast.LENGTH_LONG).show();
  15. }
  16. });

總結 1. Observable   和 subscriber 可以做任何事情 Observable 可以是一個資料庫查詢, subscriber 用來顯示查詢結果; Observable   可以是螢幕上的點選事件, subscriber 用來響應點選事件; Observable   可以是一個網絡請求, subscriber 用來顯示請求結果 。

2. Observable   和 subscriber 是獨立于中間的變換過程的。 在 Observable   和 subscriber 中間可以增減任何數量的map。整個系統是高度可組合的,操作資料是一個很簡單的過程。