【问题标题】:Retrofit java.net.SocketTimeoutException改造 java.net.SocketTimeoutException
【发布时间】:2016-09-09 20:43:16
【问题描述】:

改造电话:

 RestAdapter restAdapter = new RestAdapter.Builder()
        .setEndpoint("BASE URL")
        .setLogLevel(RestAdapter.LogLevel.FULL)
        .setClient(new OkClient(getOkHttpClient()))
        .build();

依赖关系:

compile 'com.squareup.okhttp:okhttp:2.7.2'
compile 'com.squareup.retrofit:retrofit:1.9.0'

错误: user_id=XXXX&item_id=X&item_quantity=1&item_cost=XXXX&pay_id=stripe&process_fee=XXX&total_cost=XXX&is_nagotiation=0&negotiate_id=&tips=XXX&card_id=XXXX

09-07 11:45:08.628 23473-24373/com.bridgellc.bridge D/改造:---> 结束 HTTP(177 字节正文)09-07 11:45:18.635 23473-24373/com.bridgellc.bridge D/Retrofit:----错误http:XXXXXX 09-07 11:45:18.650 23473-24373/com.bridgellc.bridge D/改造: java.net.SocketTimeoutException

【问题讨论】:

  • 正确解释问题。你什么时候收到这个错误?你试过什么解决方案?

标签: android retrofit


【解决方案1】:

这取决于各种因素,其中之一是超时,例如 connectionTimeout 等。如果您的服务器在超时内没有响应,它将抛出 SocketTimeoutException。您可以尝试增加okhttp 的默认timeout

private static OkHttpClient okClient() {
        return new OkHttpClient.Builder()
                .connectTimeout(1, TimeUnit.MINUTES)
                .writeTimeout(1, TimeUnit.MINUTES)
                .readTimeout(1, TimeUnit.MINUTES)
                .build();
    }

并将其设置为Retrofit 实例。

Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(Util.APP_UPDATE)
                .client(RestClient.okClient())
                .addConverterFactory(GsonConverterFactory.create(gson))
                .build();

【讨论】:

  • ".addConverterFactory(GsonConverterFactory.create(gson))" 不支持依赖:编译'com.squareup.retrofit:retrofit:1.9.0'
  • 我没有使用“compile 'com.squareup.retrofit2:retrofit:2.1.0'” 我使用的是“compile 'com.squareup.retrofit:retrofit:1.9.0'” 两者都不同
  • 这只是设置自定义 Ok 客户端以改造实例的参考,您可以在 1.9 的情况下将其设置为 RestAdapter。
【解决方案2】:

尝试为您的 OkHttp2 客户端设置超时。首先创建一个OkHttp2客户端,

OkHttpClient client = new OkHttpClient.Builder()
client.setConnectTimeout(5, TimeUnit.MINUTES);
client.setReadTimeout(5, TimeUnit.MINUTES);
.build();

然后将其作为默认客户端添加到Retrofit

RestAdapter restAdapter = new RestAdapter.Builder()
.setEndpoint("BASE_URL")
.setLogLevel(RestAdapter.LogLevel.FULL)
.setClient(client).build();

【讨论】:

  • 改造默认 Okclient 连接超时为 10 秒。但我更改为连接时间值为 20 秒,与您的方法相同。 RestAdapter restAdapter = new RestAdapter.Builder() .setEndpoint(AppConstants.BASE_URL) .setLogLevel(RestAdapter.LogLevel.FULL) .setClient(new OkClient(getOkHttpClient())) .build();
  • //Ok client 等待时间自定义 private OkHttpClient getOkHttpClient() { final OkHttpClient okHttpClient = new OkHttpClient(); okHttpClient.setReadTimeout(20, TimeUnit.SECONDS); okHttpClient.setConnectTimeout(20, TimeUnit.SECONDS);返回okHttpClient; }
  • 你在哪里更改了超时值?你试过我建议的代码了吗?
  • client 等待时间自定义 private OkHttpClient getOkHttpClient() { final OkHttpClient okHttpClient = new OkHttpClient(); okHttpClient.setReadTimeout(20, TimeUnit.SECONDS); okHttpClient.setConnectTimeout(20, TimeUnit.SECONDS);返回okHttpClient; } -
  • 你能尝试一个大的超时值吗?比方说,120 秒?
【解决方案3】:

您可以通过在 Android 配置文件中添加 android:vmSafeMode="true" 来解决此问题。 关于上述问题的讨论可以在github中找到。 https://github.com/square/okhttp/issues/1771 https://github.com/square/okhttp/issues/1518#issuecomment-87996760

【讨论】:

  • android:vmSafeMode="true" 我已经在清单文件中提到了该代码。
猜你喜欢
  • 1970-01-01
  • 2023-03-09
  • 2017-11-20
  • 2016-07-23
  • 1970-01-01
  • 2016-07-27
  • 1970-01-01
  • 1970-01-01
  • 2017-03-03
相关资源
最近更新 更多