2015-04-01 8 views
102

Ich verwende Retrofit Bibliothek in meiner App, und ich möchte eine Zeitüberschreitung von 60 Sekunden festlegen. Hat Retrofit etwas zu tun?Wie Timeout in Retrofit-Bibliothek festlegen?

Ich habe auf diese Weise Retrofit:

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

Wie ich das Timeout einstellen kann?

Antwort

210

Sie können Timeouts für den zugrunde liegenden HTTP-Client festlegen. Wenn Sie keinen Client angeben, erstellt Retrofit einen mit Standard-Verbindungs- und Zeitüberschreitungen. Um eigene Timeouts festzulegen, müssen Sie Ihren eigenen Client konfigurieren und an die RestAdapter.Builder senden.

Eine Option ist die Verwendung des OkHttp Clients, auch von Square.

1. Fügen Sie die Bibliothek Abhängigkeit

Im build.gradle, umfassen diese Zeile:

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

Wo x.x.x die gewünschte Version der Bibliothek ist.

2. Stellen Sie den Client

Zum Beispiel, wenn Sie ein Timeout von 60 Sekunden einzustellen, gehen Sie auf diese Weise für Retrofit vor der Version 2 und Okhttp vor Version 3 (FüR ältere Versionen SEE, die Änderungen):

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

Für okhttp Versionen seit 3.x.x haben Sie die Abhängigkeit auf diese Weise eingestellt werden:

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

und der Client stellen Sie die Erbauer mit:

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

Mehr Informationen in Timeouts


EDIT 2

Retrofit-Versionen seit 2.x.x verwendet auch die Erbauer, so die Rückkehr Block oben auf das ändern:

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

Wenn ein Code wie meine providesRestAdapter Methode verwenden, dann die Methode Rückkehr ändern Typ Retrofit .

Mehr Infos in Retrofit 2 — Upgrade Guide from 1.9


ps: Wenn Ihr minSdkVersion größer als 8 ist, können Sie TimeUnit.MINUTES verwenden:

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

Weitere Informationen zu den Einheiten finden TimeUnit.

+0

Ich sehe SetReadTimeout in der neuen Version von okhttp, keine neuen Möglichkeiten, dies zu tun? – Lion789

+2

@ Lion789 sehen Sie die bearbeitete Frage. – androidevil

+1

Ich benutze okhttp3, und für mich habe ich diesen Code verwendet: new okhttp3.OkHttpClient(). NewBuilder(); okHttpClient.readTimeout (60, TimeUnit.SECONDS); okHttpClient.writeTimeout (60, TimeUnit.SECONDS); okHttpClient.connectTimeout (60, TimeUnit.SECONDS); neue Retrofit.Builder() .client (okHttpClient.build()) – lucasddaniel

1

Ich verwende Retrofit 1.9, um eine XML zu erhalten.

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

} 

Wenn Sie Retrofit 1.9.0 und okhttp 2.6.0 verwenden, fügen Sie zu Ihrer Gradle-Datei hinzu.

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

Hinweis: Wenn Sie über einen JSON, entfernen Sie einfach aus dem Code holen müssen.

.setConverter(new SimpleXMLConverter()) 
37

Diese Antworten waren für mich veraltet, also hier ist, wie es geklappt hat.

hinzufügen OkHttp, in meinem Fall ist die Version 3.3.1:

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

Dann vor Ihrem Retrofit Bau, dies zu tun:

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

Sie haben Recht, danke für das Update! –

+0

funktioniert für mich ... –

+0

mein Schlechter, mir fehlte die() –

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

Das wird der beste Weg sein, einstellen die Zeitüberschreitung für jeden Dienst (Zeitüberschreitung als Parameter)

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

Und verpassen Sie das nicht für 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); 
     } 
    } 

Ich hoffe, dies wird jedem helfen.

Verwandte Themen