【问题标题】:How to set timeout in Retrofit library?如何在改造库中设置超时?
【发布时间】:2015-06-05 12:18:32
【问题描述】:

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

我这样设置改造:

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

如何设置超时时间?

【问题讨论】:

    标签: java android timeout retrofit


    【解决方案1】:

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

    一个选项是使用同样来自 Square 的 OkHttp 客户端。

    1.添加库依赖

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

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

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

    2。设置客户端

    例如,如果您想设置 60 秒的超时,请在版本 2 之前的 Retrofit 和版本 3 之前的 Okhttp 执行此操作(对于较新的版本,请参阅编辑):

    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 以后的 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


    编辑 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

    【讨论】:

    • 在新版本的okhttp中没有看到setReadTimeout,有什么新方法吗?
    • 我正在使用 okhttp3,对我来说,我使用了以下代码:new okhttp3.OkHttpClient().newBuilder(); okHttpClient.readTimeout(60, TimeUnit.SECONDS); okHttpClient.writeTimeout(60, TimeUnit.SECONDS); okHttpClient.connectTimeout(60, TimeUnit.SECONDS);新 Retrofit.Builder() .client(okHttpClient.build())
    • @lucasddaniel 您可以使用编辑后的答案并将 OkHttpClient 的声明名称放置到您的改造构建器中,如下所示“改造改造建造者名称 = 新改造。建造者()。客户端(okttpclientName)。构建();'
    • @Solace 我有这个方法:public Gson providesGson() { return new GsonBuilder().create(); }。所以我这样做:Gson gson = module.providesGson(); RestAdapter adapter = module.providesRestAdapter(gson);。其中模块是具有所有这些方法的正确类的实例
    • 如果你使用 OkHttp3,你必须在 Gradle 导入中使用 compile 'com.squareup.okhttp3:okhttp:3.x.x',就像 Teo 下面的回答一样
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      这些答案对我来说已经过时了,所以这就是结果。

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

      【讨论】:

      • 我的错,我错过了()
      • 60 秒后会发生什么?我们可以在那里显示任何提示吗?
      • @ArnoldBrown 您的改造调用将失败,这将调用 onFailure()
      【解决方案4】:
      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);
      
          }
      }
      

      【讨论】:

        【解决方案5】:

        这将是为每个服务设置超时的最佳方式(将超时作为参数传递)

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

        希望这对任何人都有帮助。

        【讨论】:

          【解决方案6】:

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

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

          【讨论】:

            【解决方案7】:

            我找到了这个例子

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

            【讨论】:

              【解决方案8】:
              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'
              

              【讨论】:

              • 虽然这段代码 sn-p 可以解决问题,但including an explanation 确实有助于提高帖子的质量。请记住,您正在为将来的读者回答问题,而这些人可能不知道您的代码建议的原因。也请尽量不要用解释性的 cmets 挤满你的代码,这会降低代码和解释的可读性!
              【解决方案9】:
              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'
              

              【讨论】:

              • 请解释一下你的答案。
              【解决方案10】:

              在 Kotlin 中:

              首先你应该创建一个OkHttp client 并添加Retrofit builder

              fun create(): Retrofit { 
              
                      val client = OkHttpClient.Builder()
                          .readTimeout(60,TimeUnit.SECONDS)
                          .build()
              
              
                      return Retrofit.Builder()
                          .baseUrl(BASE_URL)
                          .client(client)
                          .addConverterFactory(GsonConverterFactory.create())
                          .build()
                  }
              }
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2017-10-07
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2018-07-21
                相关资源
                最近更新 更多