RXJava2捕获从Obserable中抛出的IOException

时间:2017-06-06 19:03:07

标签: android rx-android

以下Android Java代码在执行此代码后立即调用compositeDisposible.clear()时抛出IOException。

compositeDisposable.add(Observable.zip(Observable.fromIterable(listOfDates),
            Observable.interval(200, TimeUnit.MILLISECONDS),
            (adate, timer) -> adate)
            .map((sd) -> (Globals._BASE_URL + sd.getDate()))
            .subscribe(url -> {
                compositeDisposable.add(Observable.fromCallable(new Callable<Response>() {
                    @Override
                    public okhttp3.Response call() throws Exception {
                        Request request = new Request.Builder()
                                .url(url)
                                .build();
                        return okHttpClient.newCall(request).execute();
                    }
                })
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe((response) -> {
                    ...
                }));
    }));

查看logcat异常文本,我几乎可以肯定异常发生在行&#34;返回okHttpClient.newCall(request).execute();&#34;

如何捕获此异常?

1 个答案:

答案 0 :(得分:0)

经过一些调试后,我得到了以下代码才能正常运行

compositeDisposable.add(Observable.zip(Observable.fromIterable(listOfDates),
            Observable.interval(200, TimeUnit.MILLISECONDS),
            (adate, timer) -> adate)
            .map((sd) -> (Globals._BASE_URL + sd.getDate()))
            .subscribe(url -> {
                Observable.fromCallable(new Callable<Response>() {
                    @Override
                    public okhttp3.Response call() throws Exception {
                        Request request = new Request.Builder()
                                .url(url)
                                .build();
                        return okHttpClient.newCall(request).execute();
                    }
                })
                .onErrorResumeNext((throwable) -> {Timber.e("Exception caught: " + throwable.toString());})
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe((response) -> {
                    ...
                });
    }));

onErrorResumeNext捕获okHttpClient抛出的IOException。 我还发现当我的原始代码中的内部“compositeDisposable.add”在Observable.zip仍在发出时调用compositeDisposable.clear时创建了一个条件。我还不知道为什么zip会在compositeDisposable.clear之后继续发出,因为它也被添加到Disposable中。

无论如何,我还没有设法在我试过的任何手机上崩溃这个代码,所以看起来非常强大。我希望它可以帮助有同样问题的人。