Retrofit java.net.SocketTimeoutException

4

Retrofit调用:

 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/Retrofit: ---> 结束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/Retrofit: java.net.SocketTimeoutException

提示:出现了超时异常。

1
请正确解释问题。您在什么时候遇到了这个错误?您尝试了哪些解决方案? - n.arrow001
3个回答

4

这取决于各种因素,其中之一是超时,例如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))。 依赖项:compile 'com.squareup.retrofit:retrofit:1.9.0'。 - Prithiv Dharmaraj
我没有使用“compile 'com.squareup.retrofit2:retrofit:2.1.0'”,而是使用“compile 'com.squareup.retrofit:retrofit:1.9.0'”,两者是不同的。 - Prithiv Dharmaraj
这只是关于在Retrofit实例中设置自定义Ok客户端的参考,同样地,您可以在1.9版本中将其设置为RestAdapter。 - Godfather

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();

Retrofit默认的OkClient连接超时时间为10秒。但我已将该连接时间值更改为20秒,与您的方法相同。RestAdapter restAdapter = new RestAdapter.Builder() .setEndpoint(AppConstants.BASE_URL) .setLogLevel(RestAdapter.LogLevel.FULL) .setClient(new OkClient(getOkHttpClient())) .build(); - Prithiv Dharmaraj
//客户端等待时间自定义 private OkHttpClient getOkHttpClient() { final OkHttpClient okHttpClient = new OkHttpClient(); okHttpClient.setReadTimeout(20, TimeUnit.SECONDS); okHttpClient.setConnectTimeout(20, TimeUnit.SECONDS); return okHttpClient; } - Prithiv Dharmaraj
你能试试一个较大的超时值吗?比如说,120秒? - Prokash Sarkar
还有一个疑问,你能帮我吗@ProkashSarkar - Prithiv Dharmaraj
这太荒谬和奇怪了。这是什么样的答案?对于正在寻找原因和解决方案的人来说,这完全是误导性的。问题是关于SocketTimeout问题的,而答案是不断增加套接字超时值,直到不遇到错误为止?那太荒唐了。如果设备没有连接到互联网或者互联网不可用怎么办?在这种情况下,即使你保持10,000秒的超时,错误也会出现。答案应该集中在根本原因上。这不是一个答案,而是一个解决一个使用案例的变通方法。 - Hanu
显示剩余5条评论

1

android:vmSafeMode="true" 我已经在我的清单文件中提到了这段代码。 - Prithiv Dharmaraj

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接