改造+匕首+超时

时间:2016-05-19 09:29:45

标签: android retrofit okhttp dagger

我知道最好使用单例模式来改造对象。我通常会重用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实例?

1 个答案:

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