2014-09-20 56 views
101

我正在開發使用OkHttp庫的應用程序,我的麻煩是我找不到如何設置連接超時和套接字超時。如何使用OkHttp設置連接超時

OkHttpClient client = new OkHttpClient(); 

Request request = new Request.Builder().url(url).build(); 

Response response = client.newCall(request).execute(); 

謝謝。

+2

您選擇的答案是不再有效。也許你應該編輯問題來指定okhttp的版本。 – Theyouthis 2016-01-27 22:34:09

回答

202

您只需做到這一點

OkHttpClient client = new OkHttpClient(); 
client.setConnectTimeout(15, TimeUnit.SECONDS); // connect timeout 
client.setReadTimeout(15, TimeUnit.SECONDS); // socket timeout 

Request request = new Request.Builder().url(url).build(); 
Response response = client.newCall(request).execute(); 

注意在setReadTimeout設置值是OkHttpConnectionsetSoTimeout用在Socket內部的一個。

OkHttpClient上未設置任何超時值相當於在setConnectTimeoutsetReadTimeout上設置值0,並且根本不會導致超時。說明可以發現here

正如@marceloquinta在評論中提到的setWriteTimeout也可以設置。

從版本2.5.0開始,默認情況下,讀/寫/連接超時值默認設置爲10秒,如@ChristerNordvik所述。這可以看到here

由於OkHttp3的現在可以通過Builder像這樣

client = new OkHttpClient.Builder() 
     .connectTimeout(10, TimeUnit.SECONDS) 
     .writeTimeout(10, TimeUnit.SECONDS) 
     .readTimeout(30, TimeUnit.SECONDS) 
     .build(); 

您還可以查看配方here

+0

嗨,很好,但如何設置套接字超時? – kelvincer 2014-09-22 21:17:05

+0

@kelvincer我已經更新了我的答案來解決這個問題,歡呼! – 2014-09-22 22:20:01

+0

感謝您的時間 – kelvincer 2014-09-23 02:40:09

6

對於改造2.0.0-β1或β2,代碼去如下

做到這一點
OkHttpClient client = new OkHttpClient(); 

    client.setConnectTimeout(30, TimeUnit.SECONDS); 
    client.setReadTimeout(30, TimeUnit.SECONDS); 
    client.setWriteTimeout(30, TimeUnit.SECONDS); 

    Retrofit retrofit = new Retrofit.Builder() 
      .baseUrl("http://api.yourapp.com/") 
      .addConverterFactory(GsonConverterFactory.create()) 
      .client(client) 
      .build(); 
81

對於okhttp3,這已經改變了一下。

現在,您使用的建設者,而不是制定者,像這樣成立時間:

OkHttpClient client = new OkHttpClient.Builder() 
     .connectTimeout(10, TimeUnit.SECONDS) 
     .writeTimeout(10, TimeUnit.SECONDS) 
     .readTimeout(30, TimeUnit.SECONDS) 
     .build(); 

更多信息可以在自己的wiki上找到: https://github.com/square/okhttp/wiki/Recipes#timeouts

+1

也適用於v 3.0.1。謝謝 – MBH 2016-01-22 14:58:35

8

對於改裝改裝:2.0.0 -beta4代碼去如下

OkHttpClient client = new OkHttpClient.Builder() 
     .addInterceptor(logging) 
     .connectTimeout(30, TimeUnit.SECONDS) 
     .readTimeout(30, TimeUnit.SECONDS) 
     .writeTimeout(30, TimeUnit.SECONDS) 
     .build(); 

Retrofit retrofit = new Retrofit.Builder() 
     .baseUrl("http://api.yourapp.com/") 
     .addConverterFactory(GsonConverterFactory.create()) 
     .client(client) 
     .build(); 
3

像這樣:

//New Request 
     HttpLoggingInterceptor logging = new HttpLoggingInterceptor(); 
     logging.setLevel(HttpLoggingInterceptor.Level.BASIC); 
     final OkHttpClient client = new OkHttpClient.Builder() 
       .addInterceptor(logging) 
       .connectTimeout(30, TimeUnit.SECONDS) 
       .readTimeout(30, TimeUnit.SECONDS) 
       .writeTimeout(30, TimeUnit.SECONDS) 
       .build(); 
5
//add in gradle and sync 
compile 'com.squareup.okhttp3:okhttp:3.2.0' 
compile 'com.google.code.gson:gson:2.6.2' 

import okhttp3.OkHttpClient; 
import okhttp3.OkHttpClient.Builder; 


Builder b = new Builder(); 
b.readTimeout(200, TimeUnit.MILLISECONDS); 
b.writeTimeout(600, TimeUnit.MILLISECONDS); 
// set other properties 

OkHttpClient client = b.build(); 
0

它現在已經改變。與.newBuilder()

由於okhttp的更換.Builder():3.9.0 如下圖所示:

OkHttpClient okHttpClient = new OkHttpClient() 
    .newBuilder() 
    .connectTimeout(10,TimeUnit.SECONDS) 
    .writeTimeout(10,TimeUnit.SECONDS) 
    .readTimeout(30,TimeUnit.SECONDS) 
    .build();