วิธีการตั้งค่าการหมดเวลาในไลบรารีชุดติดตั้งเพิ่มเติม


180

ฉันใช้ห้องสมุดชุดติดตั้งเพิ่มเติมในแอพของฉันและฉันต้องการตั้งค่าการหมดเวลา 60 วินาที ชุดติดตั้งเพิ่มเติมมีวิธีการทำเช่นนี้หรือไม่?

ฉันตั้งค่าติดตั้งเพิ่มเติมด้วยวิธีนี้:

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

ฉันจะตั้งค่าการหมดเวลาได้อย่างไร

คำตอบ:


320

คุณสามารถตั้งค่าการหมดเวลาบนไคลเอนต์ HTTP พื้นฐาน หากคุณไม่ระบุไคลเอนต์ Retrofit จะสร้างขึ้นใหม่พร้อมการเชื่อมต่อเริ่มต้นและหมดเวลาอ่าน ในการตั้งค่าการหมดเวลาของคุณเองคุณจะต้องกำหนดค่าไคลเอนต์ของคุณเองและส่งไปยังRestAdapter.Builderหมดเวลาในการตั้งค่าของคุณเองคุณต้องกำหนดค่าไคลเอนต์ของคุณเองและจัดหาให้

ตัวเลือกคือการใช้ไคลเอนต์OkHttpเช่นกันจาก Square

1. เพิ่มการพึ่งพาไลบรารี

ใน build.gradle ให้รวมบรรทัดนี้:

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

x.x.xรุ่นไลบรารี่ที่ต้องการอยู่ที่ไหน

2. ตั้งค่าไคลเอนต์

ตัวอย่างเช่นหากคุณต้องการตั้งค่าการหมดเวลา 60 วินาทีให้ทำเช่นนี้สำหรับ Retrofit ก่อนรุ่น 2 และ Okhttp ก่อนรุ่น 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

สำหรับเวอร์ชัน okhttp ตั้งแต่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();

ข้อมูลเพิ่มเติมในTimeouts


แก้ไข 2

ชุดติดตั้งเพิ่มเนื่องจาก2.x.xใช้รูปแบบตัวสร้างด้วยดังนั้นให้เปลี่ยนบล็อกส่งคืนด้านบนเป็น:

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

หากใช้รหัสเช่นprovidesRestAdapterวิธีการของฉันให้เปลี่ยนประเภทการคืนค่าเป็นRetrofitติดตั้งเพิ่ม

ข้อมูลเพิ่มเติมในRetrofit 2 - คู่มือการอัพเกรดจาก 1.9


ps: ถ้า minSdkVersion ของคุณมากกว่า 8 คุณสามารถใช้TimeUnit.MINUTES:

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

สำหรับรายละเอียดเพิ่มเติมเกี่ยวกับหน่วยให้ดูTIMEUNIT


ฉันไม่เห็น setReadTimeout ในเวอร์ชันใหม่ของ okhttp วิธีการใหม่ในการทำเช่นนี้
Lion789

1
ฉันใช้ okhttp3 และสำหรับฉันฉันใช้รหัสนี้: ใหม่ okhttp3.OkHttpClient (). newBuilder (); okHttpClient.readTimeout (60, TimeUnit.SECONDS); okHttpClient.writeTimeout (60, TimeUnit.SECONDS); okHttpClient.connectTimeout (60, TimeUnit.SECONDS); ใหม่ Retrofit.Builder () .client (okHttpClient.build ())
lucasddaniel

@lucasddaniel คุณสามารถใช้คำตอบที่แก้ไขแล้วและวางชื่อที่ประกาศของ OkHttpClient ไปที่ตัวสร้าง Retrofit ของคุณเช่นนี้ 'Retrofit retrofitBuilderName = new Retrofit.Builder () ลูกค้า (okttpclientName) สร้าง();'
f123

1
@Solace ฉันมีวิธี public Gson providesGson() { return new GsonBuilder().create(); }thid: Gson gson = module.providesGson(); RestAdapter adapter = module.providesRestAdapter(gson);ดังนั้นผมจึงทำเช่นนี้: โดยที่ module เป็นตัวอย่างของคลาสที่เหมาะสมที่มีวิธีการเหล่านี้ทั้งหมด
androidevil

1
หากคุณใช้ OkHttp3 คุณต้องใช้compile 'com.squareup.okhttp3:okhttp:3.x.x'การนำเข้า gradle เหมือนในคำตอบด้านล่างโดย Teo
NineToeNerd

82

คำตอบเหล่านี้ล้าสมัยสำหรับฉันดังนั้นนี่คือวิธีการใช้งาน

เพิ่ม OkHttp ในกรณีของฉันเวอร์ชันคือ3.3.1:

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

จากนั้นก่อนสร้างชุดติดตั้งเพิ่มเติมให้ทำสิ่งนี้:

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

ไม่ดีของฉันฉันหายไป ()
Jonathan Aste

จะเกิดอะไรขึ้นหลังจากนั้น 60 วินาที เราสามารถแสดงพรอมต์ที่นั่นได้ไหม?
Arnold Brown

@ArnoldBrown คุณการติดตั้งเพิ่มการโทรจะล้มเหลวซึ่งจะเรียก onFailure ()
C. Skjerdal

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
โปรดตอบคำถามของคุณ
humble_wolf

1

ฉันใช้ติดตั้งเพิ่ม 1.9เพื่อให้ได้XML

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 ให้เพิ่มไฟล์ Gradle ของคุณ

    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'
    }

หมายเหตุ: หากคุณต้องการดึงข้อมูลJSONเพียงลบจากรหัสด้านบน

.setConverter(new SimpleXMLConverter())

1

สำหรับผู้ใช้ Retrofit1.9 กับผู้ใช้ OkHttp3 นี่คือทางออก

.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

ที่นี่เราตั้งค่าไคลเอนต์การเชื่อมต่อไคลเอนต์ url ที่กำหนดเองก่อนหน้านี้ก่อนที่เราจะสร้างการใช้งานบริการส่วนที่เหลือ API

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
ในขณะที่ข้อมูลโค้ดนี้อาจแก้ไขคำถามรวมถึงคำอธิบายช่วยปรับปรุงคุณภาพของโพสต์ของคุณ จำไว้ว่าคุณกำลังตอบคำถามสำหรับผู้อ่านในอนาคตและคนเหล่านั้นอาจไม่ทราบสาเหตุของการแนะนำรหัสของคุณ โปรดอย่าพยายามทำให้รหัสของคุณแน่นเกินไปด้วยคำอธิบายที่อธิบายซึ่งจะช่วยลดความสามารถในการอ่านของทั้งรหัสและคำอธิบาย!
Filnor
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.