2016-10-06 1 views
2

In meinem Projekt verwende ich Retrofit und versuchen, Dolch zum Injizieren von Abhängigkeiten zu verwenden. Ich habe auch 2 Retrofit-Dienste mit verschiedenen APIs. Ich muss 2 verschiedene APIs mit verschiedenen baseUrls gleichzeitig verwenden. Ich bin hier geblieben und weiß nicht, was ich als nächstes tun soll.Dagger2, bietet Retrofit-Instanzen mit verschiedenen APIs zur gleichen Zeit

Mein ApplicationModule:

@Module 
public class ApplicationModule { 

private String FIRST_API_URL = "https://first-api.com"; 
private String SECOND_API_URL = "https://second-api.com"; 

private String mBaseUrl; 
private Context mContext; 

public ApplicationModule(Context context) { 
    mContext = context; 
} 

@Singleton 
@Provides 
GsonConverterFactory provideGsonConverterFactory() { 
    return GsonConverterFactory.create(); 
} 

@Singleton 
@Provides 
@Named("ok-1") 
OkHttpClient provideOkHttpClient1() { 
    return new OkHttpClient.Builder() 
      .connectTimeout(20, TimeUnit.SECONDS) 
      .readTimeout(20, TimeUnit.SECONDS) 
      .build(); 
} 

@Singleton 
@Provides 
@Named("ok-2") 
OkHttpClient provideOkHttpClient2() { 
    return new OkHttpClient.Builder() 
      .connectTimeout(60, TimeUnit.SECONDS) 
      .readTimeout(60, TimeUnit.SECONDS) 
      .build(); 
} 

@Singleton 
@Provides 
RxJavaCallAdapterFactory provideRxJavaCallAdapterFactory() { 
    return RxJavaCallAdapterFactory.create(); 
} 

@Singleton 
@Provides 
@FirstApi 
Retrofit provideRetrofit(@Named("ok-1") OkHttpClient client, GsonConverterFactory converterFactory, RxJavaCallAdapterFactory adapterFactory) { 
    return new Retrofit.Builder() 
      .baseUrl(FIRST_API_URL) 
      .addConverterFactory(converterFactory) 
      .addCallAdapterFactory(adapterFactory) 
      .client(client) 
      .build(); 
} 

@Singleton 
@Provides 
@SecondApi 
Retrofit provideRetrofit2(@Named("ok-1") OkHttpClient client, GsonConverterFactory converterFactory, RxJavaCallAdapterFactory adapterFactory) { 
    return new Retrofit.Builder() 
      .baseUrl(SECOND_API_URL) 
      .addConverterFactory(converterFactory) 
      .addCallAdapterFactory(adapterFactory) 
      .client(client) 
      .build(); 
} 

@Provides 
@Singleton 
Context provideContext() { 
    return mContext; 
} 
} 

Meine Anwendung:

public class MyApplication extends Application { 

private ApplicationComponent mApplicationComponent; 

@Override 
public void onCreate() { 
    super.onCreate(); 
    initializeApplicationComponent(); 
} 

private void initializeApplicationComponent() { 
    mApplicationComponent = DaggerApplicationComponent 
      .builder() 
      .applicationModule(new ApplicationModule(this, Constant.BASE_URL)) // I think here needs to do something to use different URLs 
      .build(); 
} 

public ApplicationComponent getApplicationComponent() { 
    return mApplicationComponent; 
} 

@Override 
public void onTerminate() { 
    super.onTerminate(); 
} 
} 

Dies ist, wie ich Abhängigkeiten in Mein Fragment bin zu lösen.

protected void resolveDependency() { 
    DaggerSerialComponent.builder() 
      .applicationComponent(getApplicationComponent()) 
      .contactModule(new ContactModule(this)) 
      .build().inject(this); 
} 

Das Problem ist, dass ich Injektion mit 2 APIs in Fragmente tun müssen, um Daten aus dieser APIs zu erhalten.

AKTUALISIERT: Ich habe Anmerkungen erstellt:

@Qualifier 
@Retention(RUNTIME) 
public @interface FirstApi{} 

@Qualifier 
@Retention(RUNTIME) 
public @interface SecondApi{} 

Mein Kontakt-Modul:

@Module 
public class ContactModule { 

private ContactView mContactView; 

public ContactModule(ContactView contactView) { 
    mContactView = contactView; 

} 

@PerActivity 
@Provides 
FirstContactService provideFirstContactService(@FirstApi Retrofit retrofit) { 
    return retrofit.create(FirstContactService.class); 
} 

@PerActivity 
@Provides 
SecondContactService provideSecondContactService(@SecondApi Retrofit retrofit) { 
    return retrofit.create(SecondContactService.class); 
} 

@PerActivity 
@Provides 
ContactView provideContactView() { 
    return mContactView; 
} 
} 

Ich bekomme immer Fehler „retrofit2.retrofit kann nicht ohne und @Provides oder @Produces zur Verfügung gestellt werden -annotierte Methode "

ApplicationComponent

@Singleton 
@Component(modules = ApplicationModule.class) 
public interface ApplicationComponent { 

    Retrofit exposeRetrofit(); 

    Context exposeContext(); 
} 
+0

wo Ihre Nachrüstung injiziert? Es sollte eine injizierbare Retrofit-Instanz in dem Fragment geben, und Sie können es wahrscheinlich auch – njzk2

Antwort

5

Sie verwenden nur die @Inject Annotation zusammen mit dem @Named() Anmerkung, etwa so:

@Inject @Named("provideRetrofit") Retrofit mRetrofit; 
@Inject @Named("provideRetrofit2") Retrofit mRetrofit2; 

Oder Sie könnten sogar die Retrofit Dienstleistungen direkt injizieren:

@Provides @Singleton 
public CustomService provideCustomService(@Named("provideRetrofit") Retrofit retrofit) { 
    return retrofit.create(CustomService.class); 
} 
+0

nennen. Wenn ich Rertofit eine benannte Annotation hinzufüge, habe ich einen Fehler erhalten: "retrofit2.Retrofit kann nicht ohne einen @Inject-Konstruktor oder von einer Methode mit bereitgestellten Annotationen bereitgestellt werden retrofit2.Retrofit wird bereitgestellt unter com.myapp.dependencies.component.ApplicationComponent.exposeRetrofit() " – STK90

+0

@ STK90 Haben Sie versucht, Ihr Projekt zu säubern und neu aufzubauen? Die Abhängigkeiten werden erst aktualisiert, wenn Dagger Ihr Objektdiagramm erstellt, was nicht vor der Ausführung eines neuen Builds geschieht. – Bryan

Verwandte Themen