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সেট করা যেতে পারে।

সংস্করণ ২.০.০ অনুসারে পড়ুন / লেখুন / সংযুক্ত সময়সীমার মানগুলি @CristerNordvik দ্বারা উল্লিখিত হিসাবে ডিফল্ট হিসাবে 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/Recines
টব্লিউগ

3
রাইট টাইমআউটটি ভুলে যাবেন না: ক্লায়েন্ট.সেটওরাইটটাইমআউট (10, টাইমউনিট.সেকেন্ডস);
marceloquinta

7
@ মিগুয়েলল্যাভিগেন জাস্ট এফওয়াইআই, ওকে এইচটিটিপি 2.5 সেকেন্ডে 10 সেকেন্ডের ডিফল্ট টাইমআউট পেয়েছে।
ক্রিস্টার নর্ডভিক

5
পুরানো উত্তর
ডিজেজয়

143

ওখট্টিপি 3 এর জন্য এটি কিছুটা পরিবর্তন হয়েছে।

এখন আপনি বিল্ডার ব্যবহার করে সময় সেট আপ করুন, এবং সেটারগুলি যেমন না:

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/recips.md#timeouts-kt-java


12

Retrofit retrofit এর জন্য: 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

Retrofit 2.0.0-beta1 বা beta2 এর জন্য কোডটি নীচে চলে

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

ওখট্টপ হিসাবে : 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();
}

আপডেট করা হয়েছে

আমি সংস্করণ থেকে ওপিটিপিতে নতুন এপি যুক্ত করেছি 3.12.0, আপনি এর মতো টাইমআউট সেট করতে পারেন:

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

দ্রষ্টব্য: এর জন্য এডিআই 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

আপনি ডিএনএস সমাধান, সংযোগ স্থাপন, অনুরোধের বডি, সার্ভার প্রসেসিং এবং প্রতিক্রিয়া বডি পড়া থেকে পুরো চক্রটি কভার করার জন্য একটি কল টাইমআউট সেট করতে পারেন।

val client = OkHttpClient().newBuilder().callTimeout(CALL_TIMEOUT_IN_MINUTES, TimeUnit.MINUTES).build()
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.