簡單介紹一下背景,最近RxJava很火,我也看來學習一下,計劃在項目的獨立模塊中使用它。使用過程當中遇到不少問題,在這裏記錄分享一下。可能有使用不當的地方,你們多多包涵。對於RxJava的基本概念和功能原理就不作介紹了。javascript
開始使用map
操做,發現處理異常時,不能在訂閱(Subscriber)的時候觀察到onError。java
public String changeFun(int i) throws Exception { if (i == 100) { throw new Exception("i == 100"); } else { return "OK"; } } public void test() { Observable.just(100).map((Integer integer) -> { try { return changeFun(integer); } catch (Exception e) { e.printStackTrace(); } return ""; }).subscribe(new Subscriber<String>() { @Override public void onCompleted() { } @Override public void onError(Throwable e) { } @Override public void onNext(String s) { } }); }
針對上面問題修改成操做符flatMap
進行實現。ide
public String changeFun(int i) throws Exception { if (i == 100) { throw new Exception("i == 100"); } else { return "OK"; } } Observable.just(100).flatMap(integer -> Observable.create(subscriber -> { try { subscriber.onNext(changeFun(integer)); subscriber.onCompleted(); } catch (Exception e) { subscriber.onError(e); } })).subscribe(new Subscriber<String>() { @Override public void onCompleted() { Log.d(TAG, "onCompleted"); } @Override public void onError(Throwable e) { Log.d(TAG, "onError:" + e.toString()); } @Override public void onNext(String s) { Log.d(TAG, "onNext:" + s); } });
flatMap
與map
在使用過程當中的區別在於 flatMap返回Observable,而map返回Object。工做原理的差異自行查閱一下吧。學習