配圖
前言
在過去的一年里,出現大量優秀的框架,火的不行,我也是從網上了解到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