2016-05-19 32 views
0

據我所知,最好使用singleton模式作爲改造對象。我通常會重用服務接口對象而不是改造。Retrofit + Dagger + Timeouts

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

然而,有一個在我的項目要求現在在哪裏,我爲每個不同的端點不同的KPI(提交API使用40秒讀超時,而具有10秒有20秒的讀取超時檢索API和驗證的API)。

那麼使用DI進行多重比較讀取超時場景的正確方法是什麼?我應該創建多個Okhttp實例還是多個Retrofit實例或多個API實例?

+0

而不是直接設置的值,你可以創建一個類,並在類中定義的初始值的超時,併爲它創建一個getter和setter,並通過此getter設置超時時間,當你需要改變超時設置其他超時設置方式 –

+0

使用工廠,爲不同的kpi創建單獨的okhttp實例。使用單例風險太大,因爲潛在的一個線程可能使用帶有一個超時值的單例,而另一個線程使用不同的超時值。 – t0mm13b

回答

0

您可以使用Dagger2使用@Named註釋創建多個Retrofit實例。您可以相應地更改readtimeout和writetimeout。

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