简单介绍一下背景,最近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。工做原理的差异自行查阅一下吧。学习