rxJava错误捕获socketTimeoutException

时间:2016-12-30 22:23:24

标签: android error-handling rx-java retrofit2 rx-android

我有一个可以通过改造生成的observable,我正在尝试实现错误处理,特别是连接超时。错误的订阅者被调用得很好,但应用程序仍然因sockettimeout错误而崩溃。有什么建议吗?

Observable<History> history = api.returnHistoryRX(pair, String.valueOf(unixTime-3600), String.valueOf(unixTime));

history.onErrorReturn(throwable -> null);

订阅者

public void getPriceNow(Observable<List<history>> history, String pair) {
        Timestamp timestamp2;
        timestamp2 = new Timestamp(System.currentTimeMillis());


        history.subscribeOn(Schedulers.newThread())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(history1 -> {
                    String currentValue;

                    if (history1.size()>0){
                        System.out.println("testing rx");

                    }
                }, e->System.out.println("getPriceNow: error called"));
    }

要测试我使用okhttp

将超时设置为不合理的低
    private  OkHttpClient.Builder httpClient = new OkHttpClient.Builder()
        .connectTimeout(30, TimeUnit.MILLISECONDS)
        .readTimeout(30L, TimeUnit.MILLISECONDS)
        .writeTimeout(100L, TimeUnit.MILLISECONDS);

错误链如下所示:

java.lang.IllegalStateException:在Scheduler.Worker线程上抛出异常。添加onError处理。

引起:rx.exceptions.OnErrorNotImplementedException:连接失败

引起:java.net.SocketTimeoutException:连接失败

3 个答案:

答案 0 :(得分:2)

当您调用history.onErrorReturn(...)时,该方法会返回 new Observable并应用相应的行为。您需要在需要应用错误处理行为的地方使用返回的observable。在您的情况下,它可能就像更改

一样简单
history.onErrorReturn(throwable -> null); 

history = history.onErrorReturn(throwable -> null);

或将其移至初始化history变量的位置。

答案 1 :(得分:0)

添加.onExceptionResumeNext {

在观察者上

答案 2 :(得分:0)

尝试设置全局错误处理程序

// 如果支持 Java 8 lambdas RxJavaPlugins.setErrorHandler(e -> { });

// 如果没有 Retrolambda 或 Jack RxJavaPlugins.setErrorHandler(Functions.emptyConsumer());