Модернизация + Кинжал + Тайм-ауты

Я понимаю, что лучше всего использовать одноэлементный шаблон для модифицированного объекта. Обычно я повторно использую объект Service Interface вместо модификации.

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

Однако теперь в моем проекте есть требование, согласно которому у меня есть разные KPI для каждой отдельной конечной точки (API отправки используют тайм-аут чтения 40 секунд, тогда как API извлечения имеют 10 секунд, а API проверки имеют время ожидания чтения 20 секунд).

Так как же правильно использовать DI для сценария тайм-аута чтения с несколькими различиями? Должен ли я создавать несколько экземпляров Okhttp, несколько экземпляров Retrofit или несколько экземпляров API?


person You Qi    schedule 19.05.2016    source источник
comment
вместо того, чтобы устанавливать значения напрямую, вы можете создать класс и в этом классе определить начальное значение для тайм-аута и создать для него геттер и сеттер и установить тайм-аут через этот геттер, и когда вам нужно изменить тайм-аут, установите другой тайм-аут тщательно сеттер   -  person Pramod Yadav    schedule 19.05.2016
comment
Используйте фабрику для создания отдельных экземпляров okhttp для разных kpi. Использование синглтона слишком рискованно, так как потенциально один поток может использовать указанный синглтон с одним значением тайм-аута, а другой поток — с другим тайм-аутом.   -  person t0mm13b    schedule 19.05.2016


Ответы (1)


Вы можете использовать Dagger2 для создания нескольких экземпляров Retrofit, используя аннотацию @Named. Вы можете изменить время ожидания чтения, время ожидания записи соответственно.

@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);
}
person jknair    schedule 19.01.2017