OkHttp के साथ कनेक्शन टाइमआउट कैसे सेट करें


173

मैं OkHttp लाइब्रेरी का उपयोग करके ऐप विकसित कर रहा हूं और मेरी परेशानी यह है कि मैं कनेक्शन टाइमआउट और सॉकेट टाइमआउट कैसे सेट कर सकता हूं।

OkHttpClient client = new OkHttpClient();

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

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

2
आपके द्वारा चयनित उत्तर अब मान्य नहीं है। हो सकता है कि आपको okhttp का संस्करण निर्दिष्ट करने के लिए प्रश्न संपादित करना चाहिए।
वेथियोसिस

जवाबों:


324

आपको बस यह करना है

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में प्रयोग किया जाता है setSoTimeoutपर Socketमें आंतरिक रूप से OkHttp Connectionवर्ग।

पर किसी भी समय-समाप्ति सेट नहीं OkHttpClientके एक मूल्य की स्थापना के बराबर है 0पर setConnectTimeoutया setReadTimeoutऔर सब पर कोई समय समाप्ति का परिणाम देगा। विवरण यहाँ पाया जा सकता है

जैसा कि टिप्पणियों में @marceloquinta द्वारा उल्लेख किया गया है, setWriteTimeoutको भी सेट किया जा सकता है।

संस्करण के रूप में 2.5.0 पढ़ने / लिखने / कनेक्ट करने का समय मान डिफ़ॉल्ट रूप से @ChristerNordvik द्वारा उल्लिखित 10 सेकंड के लिए सेट किया गया है। इसे यहां देखा जा सकता है

जैसा कि OkHttp3 अब बिल्डर के माध्यम से ऐसा कर सकता है

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

आप यहां रेसिपी भी देख सकते हैं


6
क्या प्रत्येक अनुरोध के लिए उन टाइमआउट को अलग-अलग सेट करने का एक तरीका है (प्रत्येक अनुरोध में एक ही स्थिर ग्राहक है)?
StErMi

3
आप प्रत्येक अनुरोध के लिए विशिष्ट टाइमआउट सेट कर सकते हैं: यहाँ कुछ जानकारी: github.com/square/okhttp/wiki/Recipes
Tobliug

3
मत भूलो राइट टाइमआउट: client.setWriteTimeout (10, TimeUnit.SECONDS);
मार्सेलोक्विंटा

7
@MiguelLavigne जस्ट FYI, OkHttp 2.5.0 में बदलकर 10 सेकंड का डिफ़ॉल्ट टाइमआउट है।
क्रिस्टर नॉर्डविक


143

Okhttp3 के लिए यह थोड़ा बदल गया है।

अब आप बिल्डर का उपयोग करके समय सेट करते हैं, और इस तरह से नहीं बसते हैं:

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

अधिक जानकारी उनके विकी में पाई जा सकती है: https://github.com/square/okhttp/blob/b3dcb9b1871325248fba917458658628c44ce8a3-docs/recipes.md#timeouts-kt-java


12

रेट्रोफिट रिट्रोफिट के लिए: 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();

9

रेट्रोफिट 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();

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

5

अब बदल गया है। बदलें .Builder()के साथ.newBuilder()

Okhttp के अनुसार: 3.9.0 कोड इस प्रकार है:

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

5

okhttp संस्करण:3.11.0 या उच्चतर

okhttp स्रोत कोड से

/**
 * Sets the default connect timeout for new connections. A value of 0 means no timeout,
 * otherwise values must be between 1 and {@link Integer#MAX_VALUE} when converted to
 * milliseconds.
 *
 * <p>The connectTimeout is applied when connecting a TCP socket to the target host.
 * The default value is 10 seconds.
 */
public Builder connectTimeout(long timeout, TimeUnit unit) {
  connectTimeout = checkDuration("timeout", timeout, unit);
  return this;
}

unit नीचे का कोई भी मूल्य हो सकता है

TimeUnit.NANOSECONDS
TimeUnit.MICROSECONDS
TimeUnit.MILLISECONDS
TimeUnit.SECONDS
TimeUnit.MINUTES
TimeUnit.HOURS
TimeUnit.DAYS

उदाहरण कोड

OkHttpClient client = new OkHttpClient.Builder()
        .connectTimeout(5000, TimeUnit.MILLISECONDS)/*timeout: 5 seconds*/
        .build();

String url = "https://www.google.com";
Request request = new Request.Builder()
        .url(url)
        .build();

try {
    Response response = client.newCall(request).execute();
} catch (IOException e) {
    e.printStackTrace();
}

अपडेट किया गया

मैंने संस्करण से okhttp में नई एपीआई जोड़ी है 3.12.0, आप इस तरह टाइमआउट सेट कर सकते हैं:

OkHttpClient client = new OkHttpClient.Builder()
        .connectTimeout(Duration.ofSeconds(5))/*timeout: 5 seconds*/
        .build();

नोट: इसके लिए API 26+ की आवश्यकता होती है, इसलिए यदि आप Android के पुराने संस्करणों का समर्थन करते हैं, तो उपयोग करना जारी रखें (5, TimeUnit.SECONDS)


4

इस तरह:

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

4

इसने मेरे लिए ... https://github.com/square/okhttp/issues/3553 से काम किया

OkHttpClient client = new OkHttpClient.Builder()
        .connectTimeout(10, TimeUnit.SECONDS)
        .readTimeout(10, TimeUnit.SECONDS)
        .writeTimeout(10, TimeUnit.SECONDS)
        .retryOnConnectionFailure(false) <-- not necessary but useful!
        .build();

2

यदि आप कॉन्फ़िगरेशन को कस्टमाइज़ करना चाहते हैं तो पहले OKhttpclient बनाने की नीचे की कार्यप्रणाली का उपयोग करें और फिर उसके ऊपर बिल्डर जोड़ें।

private final OkHttpClient client = new OkHttpClient();

// Copy to customize OkHttp for this request.
    OkHttpClient client1 = client.newBuilder()
        .readTimeout(500, TimeUnit.MILLISECONDS)
        .build();
    try (Response response = client1.newCall(request).execute()) {
      System.out.println("Response 1 succeeded: " + response);
    } catch (IOException e) {
      System.out.println("Response 1 failed: " + e);
    }

1

आप DNS को हल करने, कनेक्ट करने, अनुरोध बॉडी लिखने, सर्वर प्रोसेसिंग, और रिस्पॉन्स बॉडी को पढ़ने से पूरे चक्र को कवर करने के लिए कॉल टाइमआउट सेट कर सकते हैं।

val client = OkHttpClient().newBuilder().callTimeout(CALL_TIMEOUT_IN_MINUTES, TimeUnit.MINUTES).build()
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.