2017-09-03 16 views
1

異なるRetrofitインスタンスを構築する2つの@Providesメソッドを持つDaggerモジュールがあります。また、それぞれがRetrofitインスタンスの1つを消費する必要がある2つの方法があります。同じタイプの2つの異なるインスタンスを提供する

各消費関数で使用するRetrofitをDaggerに伝えるにはどうすればよいですか?

マイコード:

@Provides 
@Singleton 
public OkHttpClient provideOkHttpClient(){ 
    final OkHttpClient.Builder builder = new OkHttpClient.Builder(); 

    if (BuildConfig.DEBUG) { 
     HttpLoggingInterceptor logging = new HttpLoggingInterceptor(); 
     logging.setLevel(HttpLoggingInterceptor.Level.BODY); 
     builder.addInterceptor(logging); 
    } 

    builder.connectTimeout(60 * 1000, TimeUnit.MILLISECONDS) 
      .readTimeout(60 * 1000, TimeUnit.MILLISECONDS); 

    return builder.build(); 
} 

@Provides 
@Singleton 
public Retrofit provideRestAdapter1(Application application, OkHttpClient okHttpClient) { 
    Retrofit.Builder builder = new Retrofit.Builder(); 
    builder.client(okHttpClient) 
      .baseUrl(application.getString(R.string.Endpoint1)) 
      .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) 
      .addConverterFactory(GsonConverterFactory.create()); 
    return builder.build(); 
} 

@Provides 
@Singleton 
public Retrofit provideRestAdapter2(Application application, OkHttpClient okHttpClient) { 
    Retrofit.Builder builder = new Retrofit.Builder(); 
    builder.client(okHttpClient) 
      .baseUrl(application.getString(R.string.Endpoint2)) 
      .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) 
      .addConverterFactory(GsonConverterFactory.create()); 
    return builder.build(); 
} 

@Provides 
@Singleton 
public GithubApiService provideGithubApiService(Retrofit restAdapter) { 
    return restAdapter.create(GithubApiService.class); 
} 

@Provides 
@Singleton 
public GithubApiService2 provideGithubApiService(Retrofit restAdapter) { 
    return restAdapter.create(GithubApiService2.class); 
} 

} 

答えて

2

次の2つを区別するために@Qualifier注釈を使用することができます。

@Qualifier 
@Retention(RetentionPolicy.RUNTIME) 
public @interface EndPoint1 { 

} 

が次に該当する@Provides方法注釈を付ける:

@Provides 
@Singleton 
@EndPoint1 
public Retrofit provideRestAdapter1(Application application, OkHttpClient okHttpClient) { 
    ... 
} 

をそして、このいずれかを使用してレトロフィットを伝える

まず(もちろん、独自のJavaファイルで)新しい注釈タイプを作成します他の@Provides

@Provides 
@Singleton 
public GithubApiService provideGithubApiService(@EndPoint1 Retrofit restAdapter) { 
    return restAdapter.create(GithubApiService.class); 
} 

o独自の注釈を作成したくない場合は、@Namedを使用してください。 See the documentation here

1

また、あなたは、噴射注釈付きこの使用して、指定された注釈を取得することができ、このコード

@Provides 
@Singleton 
@Named("Google") 
Retrofit providePlaceApiClient(OkHttpClient client, Gson gson) { 
    return new Retrofit.Builder() 
      .baseUrl(BaseApiConfig.getPlaceApiUrl()) 
      .client(client) 
      .addConverterFactory(GsonConverterFactory.create(gson)) 
      .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) 
      .build(); 
} 

@Provides 
@Singleton 
Retrofit provideRetrofit(OkHttpClient client, Gson gson) { 
    return new Retrofit.Builder() 
      .baseUrl(BaseApiConfig.getBaseUrl()) 
      .client(client) 
      .addConverterFactory(GsonConverterFactory.create(gson)) 
      .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) 
      .build(); 
} 

名パラメータ

使用を使用することができます。

@Inject 
@Named("Google") 
Retrofit retrofit 

また、あなたは子referance

@Named("Google") 
Retrofit providePlaceApiClient(); 
のためにあなたのコンポーネントに追加することができます
関連する問題