Я застрял с завершением реализации Dagger 2 Retrofit2 с использованием mvp, где мое приложение совершает вызовы на два разных apis в соответствующих фрагментах. я определил квалификаторов аннотации, чтобы связать экземпляр Дооснащение для каждого Api вызова, как показано нижеDagger 2 multiple Retrofit экземпляры, созданные с разными URL-адресами для использования разных API-интерфейсов с использованием встраивания конструктора
@Qualifier
@Retention(RUNTIME)
public @interface FirstApi{}
@Qualifier
@Retention(RUNTIME)
public @interface SecondApi{}
Связывание каждого Дооснащение в ApplicationModule
public class ApplicationModule {
private String mBaseUrlFirstApi;
private String mBaseUrlSecondApi;
private Context mContext;
public ApplicationModule(Context context) {
mContext = context;
}
...
@Provides
@FirstApi Retrofit provideFirstApiRetrofit(…) {…}
@Provides
@SecondApi Retrofit provideSecondApiRetrofit(…) {…}
....
}
ApplicationComponent
@Singleton
@Component(modules = ApplicationModule.class)
public interface ApplicationComponent {
Retrofit exposeRetrofit();
Context exposeContext();
}
Область
@Scope
@Retention(RetentionPolicy.RUNTIME)
public @interface PerActivity {
}
Обеспечение ApiService
@Module
public class MyModule {
@PerActivity
@Provides
MyAPIService myApiService(Retrofit retrofit) {
return retrofit.create(MyAPIService.class);
}
}
Dagger Injector класс
@PerActivity
@Component(modules = MyModule.class, dependencies = ApplicationComponent.class)
public interface MyComponent {
void inject(Fragment1 fragment1);
void inject(Fragment2 fragment2);
// void inject(Fragment3 fragment3);
}
В классе приложений, для одного вызова Модифицированная Апи, я знаю, чтобы сделать:
public class MyApplication extends Application {
private ApplicationComponent mApplicationComponent;
{...}
private void initializeApplicationComponents() {
mApplicationComponent = DaggerApplicationComponent
.builder()
.applicationModule(new ApplicationModule(this, "http://api1"))
.build();
}
{...}
public ApplicationComponent getApplicationComponent() {
return mApplicationComponent;
}
}
Но для множественных вызовов api api это не работает
public class MyApplication extends Application {
private ApplicationComponent mApplicationComponent;
{...}
private void initializeApplicationComponents() {
mApplicationComponent = DaggerApplicationComponent
.builder()
.applicationModule(new ApplicationModule(this, "http://api1"))
.applicationModule(new ApplicationModule(this, "http://api2"))
.build();
}
{...}
public ApplicationComponent getApplicationComponent() {
return mApplicationComponent;
}
}
Ни делает это
public class MyApplication extends Application {
private ApplicationComponent mApplicationComponent;
{...}
private void initializeApplicationComponents() {
mApplicationComponent = DaggerApplicationComponentApi1
.builder()
.applicationModule(new ApplicationModule(this, "http://api1"))
.build();
mApplicationComponent = DaggerApplicationComponentApi2
.builder()
.applicationModule(new ApplicationModule(this, "http://api2"))
.build();
}
{...}
public ApplicationComponent getApplicationComponent() {
return mApplicationComponent;
}
}
Разрешающая крестик зависимость в каждом фрагменте делается как так
protected resolveDaggerDependency() {
DaggerFragmentComponent
.builder()
.applicationComponent(getApplicationComponent)
.myModule(new MyModule.class)
.build.inject(this);
}
класс BaseFragment имеет
public abstract class BaseFragment extends Fragment {
{...}
{...}
{...}
@CallSuper
protected void onViewReady(Bundle savedInstanceState, Intent intent) {
resolveDaggerDependency(); // to be used by child fragments
protected ApplicationComponent getApplicationComponent() {
return ((MyApplication)getActivity().getApplication()).getApplicationComponent;
}
}