2016-05-19 5 views
0

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

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

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

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

+0

а не устанавливать значения непосредственно вы можете создать класс, и в этом классе определить начальное значение тайм-аута и создать геттер и сеттер для него и установить тайм-аут через этот геттер и, когда вам нужно изменить тайм-аут установить другой тайм-аут тщательного сеттера –

+0

Используйте фабрику, чтобы создать отдельные экземпляры okhttp для разных kpi. Использование singleton слишком рискованно, так как потенциально один поток может использовать упомянутый синглтон с одним значением тайм-аута, а другой поток использует другой тайм-аут. – t0mm13b

ответ

0

Вы можете использовать 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); 
} 
Смежные вопросы