Rxjava學習:初識Rxjava

分類:技術 時間:2016-10-25

配圖

前言

在過去的一年里,出現大量優秀的框架,火的不行,我也是從網上了解到Rx,特意搜索了相關文章,我也是通過它初步了解了Rxjava, 通過使用也慢慢領會到了其獨特的魅力。

先談談我對Rxjava的認識

首先說一下使用的感受:作為一只程序猿,最煩的就是那無窮無盡的for循環,以及那看起來都有點喪心病狂的 格式縮進,而如果使用Rxjava來進行數據處理的話,完全沒有這方面的問題,你只要依次實現每一個方法就可以迅速獲得同樣的效果。

這里借鑒一下 給 Android 開發者的 RxJava 詳解 一文中的例子,來給大家說明一下:

假設有這樣一個需求:界面上有一個自定義的視圖 imageCollectorView ,它的作用是顯示多張圖片,并能使用 addImage(Bitmap) 方法來任意增加顯示的圖片。現在需要程序將一個給出的目錄數組 File[] folders 中每個目錄下的 png 圖片都加載出來并顯示在 imageCollectorView 中。需要注意的是,由于讀取圖片的這一過程較為耗時,需要放在后臺執行,而圖片的顯示則必須在 UI 線程執行。常用的實現方式有多種,我這里貼出其中一種:

new Thread() {
    @Override
    public void run() {
        super.run();
        for (File folder : folders) {
            File[] files = folder.listFiles();
            for (File file : files) {
                if (file.getName().endsWith(quot;.pngquot;)) {
                    final Bitmap bitmap = getBitmapFromFile(file);
                    getActivity().runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            imageCollectorView.addImage(bitmap);
                        }
                    });
                }
            }
        }
    }
}.start();

而如果使用 RxJava ,實現方式是這樣的:

Observable.from(folders)
    .flatMap(new Func1lt;File, Observablelt;Filegt;gt;() {
        @Override
        public Observablelt;Filegt; call(File file) {
            return Observable.from(file.listFiles());
        }
    })
    .filter(new Func1lt;File, Booleangt;() {
        @Override
        public Boolean call(File file) {
            return file.getName().endsWith(quot;.pngquot;);
        }
    })
    .map(new Func1lt;File, Bitmapgt;() {
        @Override
        public Bitmap call(File file) {
            return getBitmapFromFile(file);
        }
    })
    .subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe(new Action1lt;Bitmapgt;() {
        @Override
        public void call(Bitmap bitmap) {
            imageCollectorView.addImage(bitmap);
        }
    });

這樣,大家就可以理解, RxJava 的優秀在于其可讀性,只要熟悉編寫習慣后不管過多久再來看這部分代碼,仍然可以很快的理解,而上面的各種for循環寫出來的代碼,并不具備這樣的屬性。

下面就來簡單的講一下Rxjava的使用

1.引入RxJava

RxJava 支持Java 6或者更新的版本,引入前請更新到Java 6或以上版本。

compile 'io.reactivex:rxandroid:1.2.1'
compile 'io.reactivex:rxjava:1.1.8'

RxAndroid 是 Android 開發中使用 RxJava 必備元素,雖然里面只是提供了簡單的兩個功能。 AndroidSchedulers.mainThread()

和 AndroidSchedulers.handlerThread(handler) ,但這確是 Android 開發中最核心的功能之一。

2.Rxjava基本概念

下面來談談Rxjava幾個基本概念的介紹:

  • Observer(觀察者)
  • Observable (被觀察者)
  • subscribe( observer ) (訂閱)

Observer(觀察者)

Observer 提供一組不同的事件,并對各個事件進行實現,不關心事件何時發生,只決定事件觸發的時候將有怎樣的行為。

本質是一個接口,提供了三個方法,需要實現。

  • onNext(Object o): 事件隊列中,RxJava 每完成一次事件都會通過調用onNext(Object o), 對結果進行相應的操作。

  • onCompleted(): 當整個事件隊列完成所有的數據處理時,其將被調用。

  • onError(): 在整個事件隊列中,只要有一個事件處理出現問題,其將被調用,并放棄對剩下事件的處理。

Subscriberlt;Stringgt; subscriber = new Subscriberlt;Stringgt;() {
  @Override
  public void onNext(String s) {
      Log.d(tag, quot;Item: quot;   s);
  }

  @Override
  public void onCompleted() {
      Log.d(tag, quot;Completed!quot;);
  }

  @Override
  public void onError(Throwable e) {
      Log.d(tag, quot;Error!quot;);
  }
};

Observable(被觀察者)

Observable 提供事件觸發的場景,即決定什么時候觸發事件和此時該觸發什么事件,不關心事件的具體實現。

其提供了多種初始化,創建對象的方法:

  • create()

    //使用Observable.create()創建被觀察者
    Observable observable1 = Observable.create(new Observable.OnSubscribelt;Stringgt;() {
              @Override
              public void call(Subscriberlt;? super Stringgt; subscriber) {
                  subscriber.onNext(quot;Helloquot;);
                  subscriber.onNext(quot;Wroldquot;);
                  subscriber.onCompleted();
              }
          });
  • just(T...)

    Observable observable2 = Observable.just(quot;Helloquot;, quot;Worldquot;);
  • from(T[])
    String [] words = {quot;Helloquot;, quot;Worldquot;};
    Observable observable3 = Observable.from(words);
    或者
    Listlt;Stringgt; list = new ArrayListlt;Stringgt;();
    list.add(quot;Hellowquot;);
    list.add(quot;Wroldquot;);
    Observable observable4 = Observable.from(list);

subscribe( observer ) (訂閱)

創建Observable和Observer之后,通過subscribe()方法將它們結合起來。

小結

對Rxjava作了一個簡單的介紹,從基礎知識開始講起可能比較枯燥,沒有多少實踐,但是基礎的重要性不言而喻,尤其對于Rxjava來說,其代碼的編寫習慣與我們平常不太一樣,其鏈式的風格更加簡潔,當你慢慢習慣,你將領會其獨特的魅力。


Tags: RxJava 安卓開發

文章來源:http://www.jianshu.com/p/264a1322669a


ads
ads

相關文章
ads

相關文章

ad