[RxJava^Android]項目經驗分享 --- 異常方法處理

簡單介紹一下背景,最近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);
            }
        });

flatMapmap在使用過程當中的區別在於 flatMap返回Observable,而map返回Object。工做原理的差異自行查閱一下吧。學習

相關文章
相關標籤/搜索