【问题标题】:I use rxjava2+retrofit2+okhttp3 in my android application and get crashed when app not connected to internet我在我的 android 应用程序中使用 rxjava2+retrofit2+okhttp3 并在应用程序未连接到互联网时崩溃
【发布时间】:2018-03-10 22:06:34
【问题描述】:

我找到了一些解决方案 (OnErrorNotImplementedException when Interceptor throws.),但我仍然收到 OnErrorNotImplementedExceptionSocketTimeoutException 并且应用程序崩溃了。

我处理 HTTP 结果的代码:

observable.compose(TransformerHelper.<Response<T>>io_main()).doOnSubscribe(new Consumer<Disposable>() {
    @Override
    public void accept(@io.reactivex.annotations.NonNull Disposable disposable) throws Exception {
        requestCallback.onBefore();
    }
}).doOnError(new Consumer<Throwable>() {
    @Override
    public void accept(@io.reactivex.annotations.NonNull Throwable throwable) throws Exception {
        requestCallback.onAfter();
        requestCallback.onError(throwable);
    }
}).doOnComplete(new Action() {
    @Override
    public void run() throws Exception {
        requestCallback.onAfter();
    }
}).onErrorReturn(new Function<Throwable, Response<T>>() {
    @Override
    public Response<T> apply(@io.reactivex.annotations.NonNull Throwable throwable) throws Exception {
        return null;
    }
}).subscribe(new Consumer<Response<T>>() {
    @Override
    public void accept(@io.reactivex.annotations.NonNull Response<T> response) throws Exception {
        try {
            requestCallback.onAfter();
            if (response.isSuccess()) {
                requestCallback.onSuccess(response.data, response.msg);
            } else {
                requestCallback.onBizErr(response.code, response.msg);
            }
        } catch (Exception e) {
            requestCallback.onAfter();
            requestCallback.onError(e.getCause());
        }
    }
}, new Consumer<Throwable>() {
    @Override
    public void accept(@io.reactivex.annotations.NonNull Throwable throwable) throws Exception {
        requestCallback.onAfter();
        requestCallback.onError(throwable);
    }
});

【问题讨论】:

  • 如果您想增加获得答案的机会,您可能应该粘贴到堆栈跟踪中。另外,你为什么在onErrorReturn 中返回 null。 null 没有 isSuccess 方法。

标签: android retrofit2 rx-java2 okhttp3


【解决方案1】:

return null; - 在 RxJava2 中,null 不能再发送到流 (What's Different in 2.0)。这意味着返回 null 只会导致发出 NPE。

简单地说,您要么需要为失败的请求定义一个有效的替换,要么定义一个处理异常的方法。否则它将由默认的异常处理程序处理,这会使应用程序崩溃。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-19
    • 2016-06-08
    相关资源
    最近更新 更多