【问题标题】:rxJava error catching socketTimeoutExceptionrxJava 错误捕获 socketTimeoutException
【发布时间】:2017-05-15 04:17:50
【问题描述】:

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

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: 连接失败

【问题讨论】:

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


    【解决方案1】:

    当您调用 history.onErrorReturn(...) 时,该方法会返回一个 new Observable 并应用适当的行为。您需要在希望应用错误处理行为的地方使用返回的 observable。在你的情况下,它可能就像改变一样简单

    history.onErrorReturn(throwable -> null); 
    

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

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

    【讨论】:

    • 这是 100% 正确的。实际上,我发现崩溃并没有因为这些调用而发生,而是在应用程序的其他地方进行了相同的调用。在我删除导致崩溃的位之后,我仍然遇到 onErrorReturn 没有触发的问题,并且使此更新完全修复了该问题。如果没有这个,我可能会盯着同一个位子看几个小时,所以非常感谢!
    【解决方案2】:

    添加 .onExceptionResumeNext {

    观察者

    【讨论】:

      【解决方案3】:

      尝试设置 gloable 错误处理程序

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

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

      【讨论】:

        猜你喜欢
        • 2018-03-31
        • 2018-12-24
        • 1970-01-01
        • 1970-01-01
        • 2018-07-28
        • 2019-11-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多