我知道最好使用单例模式来改造对象。我通常会重用Service Interface对象而不是改造。
@Provides
@Singleton
RestAPIService providesRestAPIService(Retrofit retrofit) {
return retrofit.create(RestAPIService.class);
}
但是,我的项目现在需要为每个不同的端点提供不同的KPI(提交API使用40秒读取超时,而检索API使用10秒,验证API使用20秒读取超时)。
那么在多个diff读取超时场景中使用DI的正确方法是什么?我应该创建多个Okhttp实例还是多个Retrofit实例或多个API实例?
答案 0 :(得分: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);
}