首页 文章

如何在Retrofit库中设置超时?

提问于
浏览
137

我在我的应用程序中使用Retrofit库,我想将超时设置为60秒 . Retrofit有办法做到这一点吗?

我这样设置Retrofit:

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

如何设置超时?

9 回答

  • -2

    您可以在底层HTTP客户端上设置超时 . 如果您未指定客户端,则Retrofit将创建一个具有默认连接和读取超时的客户端 . 要设置自己的超时,您需要配置自己的客户端并将其提供给 RestAdapter.Builder .

    一个选项是使用OkHttp客户端,也来自Square .

    1. Add the library dependency

    在build.gradle中,包含以下行:

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

    x.x.x 是所需的库版本 .

    2. Set the client

    例如,如果要将超时设置为60秒,请对版本2之前的Retrofit和版本3之前的Okhttp( FOR THE NEWER VERSIONS, SEE THE EDITS )执行此操作:

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

    EDIT 1

    对于自 3.x.x 以来的okhttp版本,您必须以这种方式设置依赖关系:

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

    并使用构建器模式设置客户端:

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

    更多信息Timeouts


    EDIT 2

    2.x.x 以来的改造版本也使用构建器模式,因此将上面的返回块更改为:

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

    如果使用类似我的 providesRestAdapter 方法的代码,则将方法返回类型更改为Retrofit .

    更多信息在Retrofit 2 — Upgrade Guide from 1.9


    ps:如果你的minSdkVersion大于8,你可以使用 TimeUnit.MINUTES

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

    有关单位的更多详细信息,请参阅TimeUnit .

  • 1

    这些答案对我来说已经过时了,所以这就是它如何解决的问题 .

    添加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();
    
  • 265
    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

    我正在使用 Retrofit 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())
    
  • 61

    对于使用OkHttp3用户的Retrofit1.9,这是解决方案,

    .setClient(new Ok3Client(new OkHttpClient.Builder().readTimeout(60, TimeUnit.SECONDS).build()))
    
  • 1
    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

    这里我们在构建API rest服务实现之前设置自定义url客户端连接客户端 .

    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;
            }
        }
    
  • 0
    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'
    

相关问题