【问题标题】:java.net.SocketTimeoutException error with Retrofit and OkHttpjava.net.SocketTimeoutException 错误与 Retrofit 和 OkHttp
【发布时间】:2023-03-20 10:25:01
【问题描述】:

正如标题所说,我在尝试访问远程数据库时遇到了这个错误。这是我的崩溃日志的一部分:

retrofit.RetrofitError: failed to connect to xx.xx.xx.xx/xx.xx.xx.x (port 80) from /xx.xx.xx.xx (port 52908) after 15000ms

Caused by: java.net.SocketTimeoutException: failed to connect to xx.xx.xx.xx/xx.xx.xx.x (port 80) from /xx.xx.xx.xx (port 52908) after 15000ms

该应用程序运行良好,因为我使用各种设备对其进行了测试,并且服务器已启动并运行。

一种解决方法是增加timeout,但还有其他方法可以解决这个问题吗?我读到的所有帖子都提到了这一点,只建议设置一个高timeout。还是我应该设置一个发生此问题的用例并提醒用户检查他的连接?

非常感谢任何建议

注意:

  • 我正在使用的改造版本是:1.9.0
  • OkHttp3版本为3.0.1

【问题讨论】:

    标签: android retrofit okhttp3


    【解决方案1】:

    您很可能会收到此异常,因为您尝试从请求中读取数据但它超过了默认超时值

    这可能是网络连接问题,或者您的后端 API 由于某种原因响应时间过长。所以除了增加默认超时之外,没有办法从客户端解决这个问题

    这可能是一个

    • 连接超时
    • 读取超时
    • 写入超时

    确定您的案例中发生的超时类型并将客户端附加到改造

    Show Exception Message

    @Override
    public void onFailure(Call<ResponseType> call, Throwable t) {
        if(t instanceof SocketTimeoutException){
           String message = "Socket Time out!!";
        }
    }
    

    【讨论】:

    • 感谢您的信息。创建一个用例检查是否超过超时是否是一种好习惯,然后将向用户显示一条消息以检查他的连接或稍后尝试而不是让他陷入困境?我应该将超时时间增加多少?
    • 创建用例检查是一种好习惯 - 是的,如果超时超过默认值,显示一条消息是一个不错的选择(你可以检查这个如果异常是由SocketTimeoutException 引起的,则在改造的失败回调中,请参阅编辑后的答案)。 我应该增加多少超时时间 - 这取决于你的情况。
    • 一个简单的问题!因为我无法用我的设备重现该错误,是否像您那样处理 onFailure 方法上的错误(显示一条消息)会阻止应用程序崩溃?或者我应该用 w try/catch 包装我的方法来调用改造连接?
    • 如果是这种情况,您甚至必须在进入回调之前拦截超时。您对try/catch 的看法是正确的,但应该在拦截器方法中完成。这可以通过将拦截器附加到您的OkHttpClient 来完成,例如this
    • 感谢您的提示和链接。但就我而言,因为我使用的是Retrofit 1.9,所以我最终使用try/catch 在本地捕获RetrofitError(不是在我的所有请求中,只有一个导致崩溃的请求)
    猜你喜欢
    • 1970-01-01
    • 2017-05-25
    • 2017-03-03
    • 2017-10-10
    • 2015-12-12
    • 1970-01-01
    • 2014-07-30
    • 2018-07-17
    • 2016-04-24
    相关资源
    最近更新 更多