2016-05-19 4 views
0

改造対象にシングルトンパターンを使用することが最善であると理解します。私は通常、改造の代わりにService Interfaceオブジェクトを再利用します。私は(検索APIは、20秒の読み取りタイムアウトを持つ10秒と検証APIを持つのに対し、提出APIは、40秒の読み取りタイムアウトを使用)、それぞれ異なるエンドポイントの異なるKPIを持っているところRetrofit + Dagger + Timeouts

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

はしかし、私のプロジェクトにおける要件は、今があります。

したがって、複数のdiff読み取りタイムアウトシナリオでDIを使用する適切な方法は何ですか?複数のOkhttpインスタンスまたは複数のRetrofitインスタンスまたは複数のAPIインスタンスを作成する必要がありますか?

+0

直接ではなくクラスを作成し、そのクラスにタイムアウトの初期値を定義し、それのためのゲッターとセッターを作成し、このゲッターを通じてタイムアウトを設定することができる値を設定し、変更する必要がある場合timeout他のタイムアウトを設定します。 –

+0

ファクトリを使用して、異なるkpiのokhttpのインスタンスを個別に作成します。シングルトンを使用することは、潜在的に1つのスレッドが1つのタイムアウト値で前記シングルトンを使用し、別のスレッドが異なるタイムアウトを使用する可能性があるため、危険性が高い。 – t0mm13b

答えて

0

@Namedアノテーションを使用して、Dagger2を使用して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); 
} 
関連する問題