2016-12-20 11 views
1

Я застрял с завершением реализации 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; 
} 

} 

ответ

-1

Перед тем, как позвонить

mApplicationComponent = DaggerApplicationComponent 
       .builder() 
       .applicationModule(new ApplicationModule(this, "http://api1")) 
       .applicationModule(new ApplicationModule(this, "http://api2")) 
       .build(); 

сделать проект и использовать код завершения, чтобы увидеть, что говорит Android студии вы доступны для построитель компонентов. Моя догадка заключается в том, что конструктор вашего прикладного модуля не принимает как контекст, так и строку. После того, как вы измените конструктор, чтобы принять сказать

ApplicationModule(Context context, String url1, String url2) {...} 

то все вам нужно сделать, это изменить код впрыска удалить вторую строку .applicationModule и изменить первую строку в соответствии с новым конструктором, т.е. :

mApplicationComponent = DaggerApplicationComponent 
       .builder() 
       .applicationModule(new ApplicationModule(this, "http://api1", "http://api2")) 
       .build(); 

 Смежные вопросы

  • Нет связанных вопросов^_^