2016-05-19 10 views
0

Ich verstehe, dass es am besten ist, Singleton-Muster für Retrofit-Objekt zu verwenden. Normalerweise werde ich das Service-Interface-Objekt wiederverwenden, anstatt es nachzurüsten.Retrofit + Dolch + Timeouts

@Provides 
@Singleton 
RestAPIService providesRestAPIService(Retrofit retrofit) { 
    return retrofit.create(RestAPIService.class); 
} 

Allerdings ist es eine Anforderung jetzt in meinem Projekt, wo ich für jeden anderen Endpunkt verschiedene KPI haben (Vorlage APIs verwenden 40sec Lese-Timeout, während Retrieval-APIs mit 10 sec und Validierung APIs 20 sec lesen Timeout hat).

Also, was ist der richtige Weg, um DI für multiple Diff Read Timeout-Szenario zu verwenden? Sollte ich mehrere Okhttp-Instanzen oder mehrere Retrofit-Instanzen oder mehrere API-Instanzen erstellen?

+0

anstatt die Werte direkt einstellen Sie eine Klasse erstellen können und in dieser Klasse einen Anfangswert für die Zeitüberschreitung definieren und einen Getter und Setter für das Erstellen und das Timeout durch diese Getter gesetzt, und wenn Sie das ändern müssen Timeout Setzen Sie das andere Timeout auf "0" setzen –

+0

Verwenden Sie eine Factory, um separate Instanzen von okhttp für unterschiedliche KPI zu erstellen. Das Verwenden eines Singleton ist zu riskant, da möglicherweise ein Thread das Singleton mit einem Zeitlimitwert und der andere Thread mit einem anderen Zeitlimit verwenden könnte. – t0mm13b

Antwort

0

Sie können mit Dagger2 mehrere Instanzen von Retrofit mit @Named Annotation erstellen. Sie können das Readtimeout und das Schreibende entsprechend ändern.

@Provides 
@Named("myapi1retrofit") 
Retrofit provideRetro() { 
OkHttpClient.Builder httpClient = new OkHttpClient.Builder(); 
     httpClient.connectTimeout(2, TimeUnit.MINUTES) 
       .writeTimeout(2, TimeUnit.MINUTES) 
       .readTimeout(2, TimeUnit.MINUTES); 
    return new Retrofit.Builder() 
       .client(httpClient.build()) 
       .baseUrl("http://api1.com/") 
       .addConverterFactory(GsonConverterFactory.create()) 
       .build(); 
} 

@Provides 
@Named("myapi2retrofit") 
Retrofit provideRetro() { 
OkHttpClient.Builder httpClient = new OkHttpClient.Builder(); 
     httpClient.connectTimeout(2, TimeUnit.MINUTES) 
       .writeTimeout(1, TimeUnit.MINUTES) 
       .readTimeout(1, TimeUnit.MINUTES); 
    return new Retrofit.Builder() 
       .client(httpClient.build()) 
       .baseUrl("http://api2.com/") 
       .addConverterFactory(GsonConverterFactory.create()) 
       .build(); 
} 


@Provides 
@Named("myapi1service") 
public RestAPIService providesRestService(@Named("myapi1retrofit") Retrofit retrofit) { 
return retrofit.create(RestAPIService.class); 
} 


@Provides 
@Named("myapi1service") 
public RestAPIService providesRestService(@Named("myapi2retrofit") Retrofit retrofit) { 
return retrofit.create(RestAPIService.class); 
}