本篇主要介紹Rxjava在 Android 項目中的基礎使用和經常使用方法,旨在給對 RxJava 感興趣的人一些入門的指引.對Rxjava不熟悉的朋友能夠去看我以前寫的一篇簡單介紹 Android RxJava:基礎介紹與使用,下面就來咱們一塊兒來看看在項目中如何使用 Rxjava 吧!java
首先咱們要知道Rxjava究竟是什麼東西?爲何這麼多人用它以及它在Android項目中所佔的比重.
RxJava 在 GitHub 主頁上的自我介紹是 : a library for composing asynchronous and event-based programs using observable sequences for the Java VM
(一個在 Java VM 上使用可觀測的序列來組成異步的、基於事件的程序的庫)。這就是 RxJava ,歸納得很是精準。然而對於初學者來講,兩個字,不懂.其實說白了,Rxjava就是一個用來實現異步操做的第三方庫,而至於其餘的拓展功能也只是在實現異步過程當中提供了一些輔助功能罷了.因此總結一下就一句話:數據庫
Rxjava是一個用來實現異步的、基於事件的第三方庫(就把它理解成Android Handler 的升級版就好了)
這就到咱們今天的重頭戲了.相信不少初學者都是在如下場景初識Rxjava的segmentfault
1.201x年你必須知道的幾個Android開源庫: .......、Rxjava
這是一個基於 Rxjava+Retrofit+mvp+........的demo
Android 工做必回 Rxjava+Retrofit+.......幾件套
數組
起初本人也是由於看到這些字眼才接觸的Rxjava的,也是由於這些緣由我才使用的Rxjava. But,當你真正的去了解了Rxjava,真正的把Rxjava用到了你的項目中,你才真正知道,爲啥這麼多人說要用Rxjava,以及你爲何要用Rxjava ,由於Rxjava真的太好用太便捷了,用了一次你就離不開它了.網絡
舉個例子你就能明白了:
假如如今有這麼一個需求:你須要從數據庫中取出一組圖片資源id,而後經過遍歷將它們顯示在imageView上面,實現方式有不少種app
//操做數據庫屬於耗時操做,須要開闢一個新線程放在後臺操做 new Thread() { @Override public void run() { super.run(); final int[] drawableRes = {}; //.......從數據庫中取出id資源數組操做 //將id對應 drawable顯示在界面上,須要在UI線程操做 imageView.post(new Runnable() { @Override public void run() { imageView.setImageResource(drawableRes[0]); } }); } }.start();
Handler handler = new Handler(){ @Override public void handleMessage(Message msg) { super.handleMessage(msg); //.....操做UI imageView.setImageResource(drawableRes[0]); } }; new Thread(){ @Override public void run() { super.run(); final int[] drawableRes = {}; //.......從數據庫中取出id資源數組操做 //將id對應 drawable顯示在界面上,須要在UI線程操做 handler.sendEmptyMessage(0);//發送消息,通知主線程刷新UI } }.start();
Observable.create(new ObservableOnSubscribe<List>() { @Override public void subscribe(ObservableEmitter<List> emitter) throws Exception { drawableRes = new ArrayList<>(); //.......從數據庫中取出id資源數組操做 emitter.onNext(drawableRes); emitter.onComplete(); } }).flatMap(new Function<List, ObservableSource<Integer>>() { @Override public ObservableSource<Integer> apply(List list) throws Exception { return Observable.fromIterable(list); } }).subscribeOn(Schedulers.io())//在IO線程執行數據庫處理操做 .observeOn(AndroidSchedulers.mainThread())//在UI線程顯示圖片 .subscribe(new Observer<Integer>() { @Override public void onSubscribe(Disposable d) { Log.d("----","onSubscribe"); } @Override public void onNext(Integer integer) { imageView.setImageResource(integer);//拿到id,加載圖片 Log.d("----",integer+""); } @Override public void onError(Throwable e) { Log.d("----",e.toString()); } @Override public void onComplete() { Log.d("----","onComplete"); } });
誒,等一下,你不是說使用Rxjava實現代碼會更簡潔快捷嘛,我怎麼看着實現還變複雜了,明明只要切換一下線程,你這咋寫了這麼多,看不懂?????異步
咳咳,看不懂了吧,看不懂就對了,看着的確是變複雜了,But 代碼這一連串鏈式調用下來不是顯得代碼邏輯很清晰嗎.並且隨着業務需求的增多,你可能須要拿到圖片id時還要加一層過濾呢,只須要在加一個.xxx()方法便可,並且還能夠隨意切換操做線程,代碼依然仍是這麼清晰簡潔.並且使用Android studio 打開時還會自動縮進和顯示提示信息:async
上面的例子省去了部分代碼,也是我隨手寫的,只要是讓你體會一下Rxjava的書寫方式和對比一下傳統方式的實現有什麼不一樣,看不懂不要緊,下面我會一一解釋,搬好小板凳
總結一下:ide
爲何要用Rxjava: 由於隨着程序邏輯變得愈來愈複雜,它依然可以保持代碼的簡潔和閱讀性.
關於Rxjava的簡單集成和基礎使用請查看我以前的介紹Android RxJava:基礎介紹與使用post
首先大概說一下Rxjava的原理:
1.概念: 觀察者模式RxJava 的異步實現,是經過一種擴展的觀察者模式來實現的。
至於觀察者模式的原理實現你們確定都已經很熟悉了,我就再也不闡述了,不熟悉的能夠自行搜索.
RxJava 有四個基本概念:Observable (可觀察者,即被觀察者)、 Observer (觀察者)、 subscribe (訂閱)、事件。Observable 和 Observer 經過 subscribe() 方法實現訂閱關係,從而 Observable 能夠在須要的時候發出事件來通知 Observer。
RxJava 的事件回調方法除了普通事件 onNext() (至關於 onClick() / onEvent())以外,還定義了兩個特殊的事件:onCompleted() 和 onError()。
onCompleted(): 事件隊列完結。RxJava 不只把每一個事件單獨處理,還會把它們看作一個隊列。RxJava 規定,當不會再有新的 onNext() 發出時,須要觸發
Observer observer = new Observer<String>(){ @Override public void onSubscribe(Disposable d) { Log.d("----","onSubscribe" ); } @Override public void onNext(String s) { Log.d("----", s); } @Override public void onError(Throwable e) { Log.d("----", "onError"); } @Override public void onComplete() { Log.d("----", "onComplete"); } };
Observable observable =Observable.create(new ObservableOnSubscribe<String>() { @Override public void subscribe(ObservableEmitter<String> emitter) throws Exception { emitter.onNext("rxjava"); emitter.onComplete(); } });
observable.subscribe(observer);
以上就是傳統的使用方式,你也能夠採用鏈式調用:
Observable.create(new ObservableOnSubscribe<String>() { @Override public void subscribe(ObservableEmitter<String> emitter) throws Exception { emitter.onNext("rxjava"); emitter.onComplete(); } }).subscribe(new Observer<String>() { @Override public void onSubscribe(Disposable d) { Log.d("----", "onSubscribe"); } @Override public void onNext(String s) { Log.d("----", s); } @Override public void onError(Throwable e) { Log.d("----", "onError"); } @Override public void onComplete() { Log.d("----", "onComplete"); } });
在 RxJava 的默認規則中,事件的發出和消費都是在同一個線程的。也就是說,若是隻用上面的方法,實現出來的只是一個同步的觀察者模式。觀察者模式自己的目的就是『後臺處理,前臺回調』的異步機制,所以異步對於 RxJava 是相當重要的。而要實現異步,則須要用到 RxJava 的另外一個概念: Scheduler 。
先貼代碼,如下即可實現異步操做:
Observable.create(new ObservableOnSubscribe<String>() { @Override public void subscribe(ObservableEmitter<String> emitter) throws Exception { emitter.onNext("rxjava"); emitter.onComplete(); } }).subscribeOn(Schedulers.newThread()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Observer<String>() { @Override public void onSubscribe(Disposable d) { Log.d("----", "onSubscribe"); } @Override public void onNext(String s) { Log.d("----", s); } @Override public void onError(Throwable e) { Log.d("----", "onError"); } @Override public void onComplete() { Log.d("----", "onComplete"); } });
在這裏咱們使用了Scheduler 進行了線程的切換,接下來介紹一下Scheduler :
在不指定線程的狀況下, RxJava 遵循的是線程不變的原則,即:在哪一個線程調用 subscribe(),就在哪一個線程生產事件;在哪一個線程生產事件,就在哪一個線程消費事件。若是須要切換線程,就須要用到 Scheduler (調度器)。
RxJava 已經內置了幾個 Scheduler :
有了這幾個 Scheduler ,就可使用 subscribeOn() 和 observeOn() 兩個方法來對線程進行控制了。
簡單使用以下:
Observable.create(new ObservableOnSubscribe<String>() { @Override public void subscribe(ObservableEmitter<String> emitter) throws Exception { emitter.onNext("1"); emitter.onNext("2"); emitter.onNext("3"); emitter.onComplete(); } }).subscribeOn(Schedulers.io()) //在io執行上述操做 .observeOn(AndroidSchedulers.mainThread())//在UI線程執行下面操做 .subscribe(new Observer<String>() { @Override public void onSubscribe(Disposable d) { Log.d("----","開始了"); } @Override public void onNext(String s) { Log.d("----", s); } @Override public void onError(Throwable e) { } @Override public void onComplete() { Log.d("----", "complete"); } });
以上就是Rxjava的基本經常使用方法了,看到這裏你就已經能夠愉快的使用Rxjava代替AsyncTask / Handler了,趕忙去試試吧!
關於Rxjava系列一就到此結束啦,後面有時間我還會寫寫一些其餘的經常使用拓展操做符和與retrofit2的結合使用,歡迎關注訂閱!
歡迎關注做者darryrzhong,更多幹貨等你來拿喲.
更多精彩文章請關注