কীভাবে রেট্রোফিট লাইব্রেরিতে সময়সীমা সেট করবেন?


180

আমি আমার অ্যাপে রেট্রোফিট লাইব্রেরি ব্যবহার করছি এবং আমি 60 সেকেন্ডের টাইমআউট সেট করতে চাই। Retrofit এর কি কিছু উপায় আছে?

আমি এইভাবে পুনঃনির্ধারণ সেট করেছি:

RestAdapter restAdapter = new RestAdapter.Builder()
    .setServer(BuildConfig.BASE_URL)
    .setConverter(new GsonConverter(gson))
    .build();

আমি কীভাবে সময়সীমা নির্ধারণ করতে পারি?

উত্তর:


319

আপনি অন্তর্নিহিত HTTP ক্লায়েন্টের সময়সীমা সেট করতে পারেন। আপনি যদি ক্লায়েন্ট নির্দিষ্ট না করে থাকেন তবে retrofit ডিফল্ট সংযোগ এবং পাঠের সময়সীমা সহ একটি তৈরি করবে। আপনার নিজস্ব সময়সীমা সেট করতে আপনাকে নিজের ক্লায়েন্টটি কনফিগার করতে হবে এবং এটি সরবরাহ করতে হবে RestAdapter.Builder

স্কয়ার থেকেও OkHttp ক্লায়েন্ট ব্যবহার করা একটি বিকল্প use

1. লাইব্রেরি নির্ভরতা যুক্ত করুন

বিল্ড.gradle এ, এই লাইনটি অন্তর্ভুক্ত করুন:

compile 'com.squareup.okhttp:okhttp:x.x.x'

x.x.xকাঙ্ক্ষিত গ্রন্থাগার সংস্করণটি কোথায় ।

2. ক্লায়েন্ট সেট করুন

উদাহরণস্বরূপ, আপনি যদি 60 সেকেন্ডের সময়সীমা নির্ধারণ করতে চান তবে সংস্করণ 2 এর পূর্বে রেট্রোফিটের জন্য এবং সংস্করণ 3 (নতুন সংস্করণের জন্য, সম্পাদনাগুলি দেখুন ) এর আগে ওখট্টপেটের জন্য এইভাবে করুন :

public RestAdapter providesRestAdapter(Gson gson) {
    final OkHttpClient okHttpClient = new OkHttpClient();
    okHttpClient.setReadTimeout(60, TimeUnit.SECONDS);
    okHttpClient.setConnectTimeout(60, TimeUnit.SECONDS);

    return new RestAdapter.Builder()
        .setEndpoint(BuildConfig.BASE_URL)
        .setConverter(new GsonConverter(gson))
        .setClient(new OkClient(okHttpClient))
        .build();
}

সম্পাদনা 1

ওখটিপিপি সংস্করণগুলির জন্য 3.x.x, আপনাকে নির্ভরতাটি এইভাবে সেট করতে হবে:

compile 'com.squareup.okhttp3:okhttp:x.x.x'

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

final OkHttpClient okHttpClient = new OkHttpClient.Builder()
        .readTimeout(60, TimeUnit.SECONDS)
        .connectTimeout(60, TimeUnit.SECONDS)
        .build();

টাইমআউটগুলিতে আরও তথ্য


সম্পাদনা 2

Retrofit সংস্করণগুলি যেহেতু 2.x.xবিল্ডার প্যাটার্নটিও ব্যবহার করে, তাই উপরের রিটার্ন ব্লকটিকে এটিতে পরিবর্তন করুন:

return new Retrofit.Builder()
    .baseUrl(BuildConfig.BASE_URL)
    .addConverterFactory(GsonConverterFactory.create())
    .client(okHttpClient)
    .build();

যদি আমার providesRestAdapterপদ্ধতির মতো কোনও কোড ব্যবহার করে থাকেন , তবে পদ্ধতিটির রিটার্নের ধরণটি রিট্রোফিটে পরিবর্তন করুন ।

Retrofit 2 এ আরও তথ্য - 1.9 থেকে আপগ্রেড গাইড


PS: যদি আপনার minSdkVersion 8 এর চেয়ে বেশি হয়, আপনি ব্যবহার করতে পারেন TimeUnit.MINUTES:

okHttpClient.setReadTimeout(1, TimeUnit.MINUTES);
okHttpClient.setConnectTimeout(1, TimeUnit.MINUTES);

ইউনিট সম্পর্কে আরও তথ্যের জন্য, টাইমউনিট দেখুন


আমি ওখটিপপির নতুন সংস্করণে সেটডিডটাইমআউট দেখতে পাচ্ছি না, এটি করার কোনও নতুন উপায়?
লায়ন 789

1
আমি ওখট্টিপি 3 ব্যবহার করছি, এবং আমার জন্য আমি এই কোডটি ব্যবহার করেছি: নতুন ওখট্টিপি 3 Oঅখ এইচটিপি ক্লায়েন্ট ()। নতুন বিল্ডার (); okHttpClient.readTimeout (60, টাইমউনিত.এসকেন্ডস); okHttpClient.writeTimeout (60, টাইমউনিট.এসকেন্ডস); okHttpClient.conectedTimeout (60, টাইমউনিট.এসইএনএনডিএস); নতুন রেট্রোফিট.বিল্ডার () .ক্লায়েন্ট (okHttpClient.build ())
lucasddaniel

@ lucasddaniel আপনি সম্পাদিত উত্তরটি ব্যবহার করতে পারেন এবং OkHttpClient এর ঘোষিত নামটি এই 'রেট্রোফিট রেট্রোফিটবিল্ডারনেম = নতুন রেট্রোফিট.বিল্ডার () এর মতো আপনার retrofit নির্মাতাকে রাখতে পারেন। ক্লায়েন্ট (okttpclientName)। বিল্ড (); '
f123

1
@Solace আমি thid পদ্ধতি আছে: public Gson providesGson() { return new GsonBuilder().create(); }। তাই আমি এই কাজ: Gson gson = module.providesGson(); RestAdapter adapter = module.providesRestAdapter(gson);। যেখানে মডিউলটি যথাযথ শ্রেণীর একটি উদাহরণ যেখানে এই সমস্ত পদ্ধতি রয়েছে
অ্যান্ড্রয়েডভিল

1
আপনি যদি ওএইচটিটিপি ৩ ব্যবহার compile 'com.squareup.okhttp3:okhttp:3.x.x'করছেন তবে নীচের উত্তরের মতো গ্রেড আমদানিতে আপনাকে টিও
নাইনটিওনার্ড

82

এই উত্তরগুলি আমার জন্য পুরানো ছিল, সুতরাং এটি কীভাবে কার্যকর হয়েছিল তা এখানে।

OkHttp যুক্ত করুন, আমার ক্ষেত্রে সংস্করণটি হ'ল 3.3.1:

compile 'com.squareup.okhttp3:okhttp:3.3.1'

তারপরে আপনার retrofit তৈরির আগে, এটি করুন:

OkHttpClient okHttpClient = new OkHttpClient().newBuilder()
    .connectTimeout(60, TimeUnit.SECONDS)
    .readTimeout(60, TimeUnit.SECONDS)
    .writeTimeout(60, TimeUnit.SECONDS)
    .build();
return new Retrofit.Builder()
    .baseUrl(baseUrl)
    .client(okHttpClient)
    .addConverterFactory(GsonConverterFactory.create())
    .build();

আমার খারাপ, আমি মিস করছি ()
জোনাথন অ্যাসেট

60 সেকেন্ড পরে কি হবে? আমরা কি ঠিক সেখানে কোনও প্রম্পট দেখাতে পারি?
আর্নল্ড ব্রাউন 11

@ আর্নল্ডব্রাউন আপনি পুনঃনির্মাণ কলটি ব্যর্থ হবে যা কলটি ফেলবে ()
সি স্কজারডাল

10
public class ApiClient {
    private static Retrofit retrofit = null;
    private static final Object LOCK = new Object();

    public static void clear() {
        synchronized (LOCK) {
            retrofit = null;
        }
    }

    public static Retrofit getClient() {
        synchronized (LOCK) {
            if (retrofit == null) {

                Gson gson = new GsonBuilder()
                        .setLenient()
                        .create();

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


                retrofit = new Retrofit.Builder()
                        .client(okHttpClient)
                        .baseUrl(Constants.WEB_SERVICE)
                        .addConverterFactory(GsonConverterFactory.create(gson))
                        .build();
            }
            return retrofit;
        }

    }

    public static RequestBody plain(String content) {
        return getRequestBody("text/plain", content);
    }

    public static RequestBody getRequestBody(String type, String content) {
        return RequestBody.create(MediaType.parse(type), content);
    }
}

@FormUrlEncoded
@POST("architect/project_list_Design_files")
Call<DesignListModel> getProjectDesign(
        @Field("project_id") String project_id);


@Multipart
@POST("architect/upload_design")
Call<BoqListModel> getUpLoadDesign(
        @Part("user_id") RequestBody user_id,
        @Part("request_id") RequestBody request_id,
        @Part List<MultipartBody.Part> image_file,
        @Part List<MultipartBody.Part> design_upload_doc);


private void getMyProjectList()
{

    ApiInterface apiService = ApiClient.getClient().create(ApiInterface.class);
    Call<MyProjectListModel> call = apiService.getMyProjectList("",Sorting,latitude,longitude,Search,Offset+"",Limit);
    call.enqueue(new Callback<MyProjectListModel>() {
        @Override
        public void onResponse(Call<MyProjectListModel> call, Response<MyProjectListModel> response) {
            try {
                Log.e("response",response.body()+"");

            } catch (Exception e)
            {
                Log.e("onResponse: ", e.toString());
                           }
        }
        @Override
        public void onFailure(Call<MyProjectListModel> call, Throwable t)
        {
            Log.e( "onFailure: ",t.toString());
                   }
    });
}

// file upload

private void getUpload(String path,String id)
    {

        ApiInterface apiService = ApiClient.getClient().create(ApiInterface.class);
        MultipartBody.Part GalleryImage = null;
        if (path!="")
        {
            File file = new File(path);
            RequestBody reqFile = RequestBody.create(MediaType.parse("multipart/form-data"), file);
            GalleryImage = MultipartBody.Part.createFormData("image", file.getName(), reqFile);
        }

        RequestBody UserId = RequestBody.create(MediaType.parse("text/plain"), id);
        Call<uplod_file> call = apiService.geUplodFileCall(UserId,GalleryImage);
        call.enqueue(new Callback<uplod_file>() {
            @Override
            public void onResponse(Call<uplod_file> call, Response<uplod_file> response) {
                try {
                    Log.e("response",response.body()+"");
                    Toast.makeText(getApplicationContext(),response.body().getMessage(),Toast.LENGTH_SHORT).show();

                } catch (Exception e)
                {
                    Log.e("onResponse: ", e.toString());
                }
            }
            @Override
            public void onFailure(Call<uplod_file> call, Throwable t)
            {
                Log.e( "onFailure: ",t.toString());
            }
        });
    }

    implementation 'com.squareup.retrofit2:retrofit:2.4.0'
    implementation 'com.squareup.retrofit2:converter-gson:2.4.0'

4
আপনার উত্তরের জন্য কিছু এক্সপেনশন।
বিনীত_উल्फ

1

আমি এক্সএমএল পেতে retrofit 1.9 ব্যবহার করছি ।

public class ServicioConexionRetrofitXML {

    public static final String API_BASE_URL = new GestorPreferencias().getPreferencias().getHost();
    public static final long tiempoMaximoRespuestaSegundos = 60;
    public static final long tiempoMaximoLecturaSegundos = 100;
    public static final OkHttpClient clienteOkHttp = new OkHttpClient();


    private static RestAdapter.Builder builder = new RestAdapter.Builder().
            setEndpoint(API_BASE_URL).
            setClient(new OkClient(clienteOkHttp)).setConverter(new SimpleXMLConverter());


    public static <S> S createService(Class<S> serviceClass) {
        clienteOkHttp.setConnectTimeout(tiempoMaximoRespuestaSegundos, TimeUnit.SECONDS);
        clienteOkHttp.setReadTimeout(tiempoMaximoLecturaSegundos, TimeUnit.SECONDS);
        RestAdapter adapter = builder.build();
        return adapter.create(serviceClass);
    }

}

আপনি যদি retrofit 1.9.0 এবং okhttp 2.6.0 ব্যবহার করেন তবে আপনার গ্রেডল ফাইলটিতে যুক্ত করুন।

    compile 'com.squareup.retrofit:retrofit:1.9.0'
    compile 'com.squareup.okhttp:okhttp:2.6.0'
    // Librería de retrofit para XML converter (Simple) Se excluyen grupos para que no entre
    // en conflicto.
    compile('com.squareup.retrofit:converter-simplexml:1.9.0') {
        exclude group: 'xpp3', module: 'xpp3'
        exclude group: 'stax', module: 'stax-api'
        exclude group: 'stax', module: 'stax'
    }

দ্রষ্টব্য: আপনার যদি জেএসওএন আনার দরকার হয় তবে উপরের কোড থেকে সরিয়ে দিন।

.setConverter(new SimpleXMLConverter())

1

OkHttp3 ব্যবহারকারীদের সাথে retrofit1.9 এর জন্য, সমাধানটি এখানে রয়েছে,

.setClient(new Ok3Client(new OkHttpClient.Builder().readTimeout(60, TimeUnit.SECONDS).build()))

0
public class ApiModule {
    public WebService apiService(Context context) {
        String mBaseUrl = context.getString(BuildConfig.DEBUG ? R.string.local_url : R.string.live_url);

        HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor();
        loggingInterceptor.setLevel(BuildConfig.DEBUG ? HttpLoggingInterceptor.Level.BODY : HttpLoggingInterceptor.Level.NONE);

        OkHttpClient okHttpClient = new OkHttpClient.Builder()
                .readTimeout(120, TimeUnit.SECONDS)
                .writeTimeout(120, TimeUnit.SECONDS)
                .connectTimeout(120, TimeUnit.SECONDS)
                .addInterceptor(loggingInterceptor)
                //.addNetworkInterceptor(networkInterceptor)
                .build();

        return new Retrofit.Builder().baseUrl(mBaseUrl)
                .client(okHttpClient)
                .addConverterFactory(GsonConverterFactory.create())
                .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                .build().create(WebService.class);

    }
}

0

প্রতিটি পরিষেবাটির সময়সীমা নির্ধারণের জন্য এটি সর্বোত্তম উপায় হবে (প্যারামিটার হিসাবে সময়সীমা অতিক্রম করে)

public static Retrofit getClient(String baseUrl, int serviceTimeout) {
        Retrofit retrofitselected = baseUrl.contains("http:") ? retrofit : retrofithttps;
        if (retrofitselected == null || retrofitselected.equals(retrofithttps)) {
            retrofitselected = new Retrofit.Builder()
                    .baseUrl(baseUrl)
                    .addConverterFactory(GsonConverterFactory.create(getGson().create()))
                    .client(!BuildConfig.FLAVOR.equals("PRE") ? new OkHttpClient.Builder()
                            .addInterceptor(new ResponseInterceptor())
                            .connectTimeout(serviceTimeout, TimeUnit.MILLISECONDS)
                            .writeTimeout(serviceTimeout, TimeUnit.MILLISECONDS)
                            .readTimeout(serviceTimeout, TimeUnit.MILLISECONDS)
                            .build() : getUnsafeOkHttpClient(serviceTimeout))
                    .build();
        }
        return retrofitselected;
    }

এবং OkHttpClient এর জন্য এটি মিস করবেন না।

private static OkHttpClient getUnsafeOkHttpClient(int serviceTimeout) {
        try {
            // Create a trust manager that does not validate certificate chains
            final TrustManager[] trustAllCerts = new TrustManager[] {
                    new X509TrustManager() {
                        @Override
                        public void checkClientTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException {
                        }

                        @Override
                        public void checkServerTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException {
                        }

                        @Override
                        public java.security.cert.X509Certificate[] getAcceptedIssuers() {
                            return new java.security.cert.X509Certificate[]{};
                        }
                    }
            };

            // Install the all-trusting trust manager
            final SSLContext sslContext = SSLContext.getInstance("SSL");
            sslContext.init(null, trustAllCerts, new java.security.SecureRandom());
            // Create an ssl socket factory with our all-trusting manager
            final SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();

            OkHttpClient.Builder builder = new OkHttpClient.Builder();
            builder.sslSocketFactory(sslSocketFactory);
            builder.hostnameVerifier(new HostnameVerifier() {
                @Override
                public boolean verify(String hostname, SSLSession session) {
                    return true;
                }
            });

            OkHttpClient okHttpClient = builder
                    .addInterceptor(new ResponseInterceptor())
                    .connectTimeout(serviceTimeout, TimeUnit.MILLISECONDS)
                    .writeTimeout(serviceTimeout, TimeUnit.MILLISECONDS)
                    .readTimeout(serviceTimeout, TimeUnit.MILLISECONDS)
                    .build();
            return okHttpClient;
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

আশা করি এটি যে কাউকে সাহায্য করবে।


0

আমি এই উদাহরণ খুঁজে পেয়েছি

https://github.com/square/retrofit/issues/1557

আমরা এপিআই রেস্ট পরিষেবা বাস্তবায়ন তৈরি করার আগে আমরা এখানে কাস্টম ইউআরএল ক্লায়েন্ট সংযোগ ক্লায়েন্ট সেট করেছি।

import com.google.gson.Gson
import com.google.gson.GsonBuilder
import retrofit.Endpoint
import retrofit.RestAdapter
import retrofit.client.Request
import retrofit.client.UrlConnectionClient
import retrofit.converter.GsonConverter


class ClientBuilder {

    public static <T> T buildClient(final Class<T> client, final String serviceUrl) {
        Endpoint mCustomRetrofitEndpoint = new CustomRetrofitEndpoint()


        Gson gson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create()
        RestAdapter.Builder builder = new RestAdapter.Builder()
            .setEndpoint(mCustomRetrofitEndpoint)
            .setConverter(new GsonConverter(gson))
            .setClient(new MyUrlConnectionClient())
        RestAdapter restAdapter = builder.build()
        return restAdapter.create(client)
    }
}

 public final class MyUrlConnectionClient extends UrlConnectionClient {
        @Override
        protected HttpURLConnection openConnection(Request request) {
            HttpURLConnection connection = super.openConnection(request);
            connection.setConnectTimeout(15 * 1000);
            connection.setReadTimeout(30 * 1000);
            return connection;
        }
    }

-1
public class ApiClient {
    private static Retrofit retrofit = null;
    private static final Object LOCK = new Object();

    public static void clear() {
        synchronized (LOCK) {
            retrofit = null;
        }
    }

    public static Retrofit getClient() {
        synchronized (LOCK) {
            if (retrofit == null) {

                Gson gson = new GsonBuilder()
                        .setLenient()
                        .create();

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

                // Log.e("jjj", "=" + (MySharedPreference.getmInstance().isEnglish() ? Constant.WEB_SERVICE : Constant.WEB_SERVICE_ARABIC));
                retrofit = new Retrofit.Builder()
                        .client(okHttpClient)
                        .baseUrl(Constants.WEB_SERVICE)
                        .addConverterFactory(GsonConverterFactory.create(gson))
                        .build();
            }
            return retrofit;
        }`enter code here`

    }

    public static RequestBody plain(String content) {
        return getRequestBody("text/plain", content);
    }

    public static RequestBody getRequestBody(String type, String content) {
        return RequestBody.create(MediaType.parse(type), content);
    }
}


-------------------------------------------------------------------------


    implementation 'com.squareup.retrofit2:retrofit:2.4.0'
    implementation 'com.squareup.retrofit2:converter-gson:2.4.0'

2
যদিও এই কোড স্নিপেট একটি ব্যাখ্যা সহ প্রশ্নটি সমাধান করতে পারে, সত্যিই আপনার পোস্টের মান উন্নত করতে সহায়তা করে। মনে রাখবেন যে আপনি ভবিষ্যতে পাঠকদের জন্য প্রশ্নের উত্তর দিচ্ছেন, এবং সেই লোকেরা আপনার কোড পরামর্শের কারণগুলি জানেন না। আপনার কোডটি ব্যাখ্যামূলক মন্তব্যে ভিড় না করার চেষ্টা করুন, এটি কোড এবং ব্যাখ্যা উভয়ের পাঠযোগ্যতা হ্রাস করে!
ফিল্নোর
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.