2016-12-06 8 views
0

Я пытаюсь создать простое приложение с модификацией 2, кинжалом 2 и MVP, но я борюсь с зависимостями, актуальными, это ошибка, которую я получаю после того, как я попытаюсь перестроить project Ошибка: выполнение выполнено для задачи ': app: compileDebugJavaWithJavac'.Кинжал 2 не может разрешить символ «DaggerAppComponent»

java.lang.StackOverflowError

, а также в App классе, где я обеспечиваю AppComponent: не может разрешить символ «DaggerAppComponent»

Я постараюсь показать вам, что мой проект выглядит так кто-то может увидеть проблему, первый из них является мой AppModule, который включает в себя PresentationModule.class

@Module(includes = PresentationModule.class) 
public class AppModule { 
    private App app; 

    public AppModule(App app) { 
     this.app = app; 
    } 

    @Provides 
    @Singleton 
    public App provideApp() { 
     return app; 
    } 
} 

Презентация модуля выглядит следующим образом:

@Module(includes = InteractorModule.class) 
public class PresentationModule { 

    @Provides 
    JokePresenter providePresenter(JokeInteractor jokeInteractor) { 
     return new JokePresenterImpl(jokeInteractor); 
    } 
} 

И InteractorModule:

@Module(includes = {NetworkModule.class, PresentationModule.class}) 
public class InteractorModule { 

    @Provides 
    JokeInteractor provideJokeInteractor(RetrofitService service, JokePresenter presenter) { 
     return new JokeInteractorImpl(service, presenter); 
    } 
} 

Это JokePresenter, что есть ссылка для просмотра и Interactor:

public class JokePresenterImpl implements JokePresenter { 

    private JokeView mJokeView; 
    private List<String> mData = new ArrayList<>(); 
    private String mJoke; 
    private JokeInteractor jokeInteractor; 

    public JokePresenterImpl(JokeInteractor jokeInteractor) { 
     this.jokeInteractor = jokeInteractor; 
    } 

    @Override 
    public void setView(JokeView view) { 
     this.mJokeView = view; 
    } 

    @Override 
    public void getRandomJoke() { 
     mJokeView.showProgress(); 
     jokeInteractor.getRandomJoke(); 
    } 
} 

И JokeInteractor, что имеет RetrofitService и JokePresenter ссылки:

public class JokeInteractorImpl implements JokeInteractor { 

    private RetrofitService retrofitService; 
    private JokePresenter presenter; 

    public JokeInteractorImpl(RetrofitService service, JokePresenter presenter) { 
     this.retrofitService = service; 
     this.presenter = presenter; 
    } 

    @Override 
    public void getRandomJoke() { 
     retrofitService.getRandomJoke() 
       .subscribeOn(Schedulers.io()) 
       .observeOn(AndroidSchedulers.mainThread()) 
       .subscribe(new Observer<RandomJokeResponse>() { 
        @Override 
        public void onCompleted() { 
         presenter.onRandomJokeCompleted(); 
        } 

        @Override 
        public void onError(Throwable e) { 
         presenter.onError(e.getMessage()); 
        } 

        @Override 
        public void onNext(RandomJokeResponse randomJokeResponse) { 
         presenter.onNextRandomJoke(randomJokeResponse); 
        } 
       }); 
    } 

Gradle зависимостей :

apt 'com.google.dagger:dagger-compiler:2.7' 
    compile 'com.google.dagger:dagger:2.7' 
    provided 'javax.annotation:jsr250-api:1.0' 

    //retrofit 
    compile 'com.squareup.retrofit2:retrofit:2.1.0' 
    compile 'com.squareup.okhttp:okhttp:2.5.0' 
    compile 'com.squareup.retrofit2:converter-gson:2.1.0' 
    compile 'com.squareup.retrofit2:adapter-rxjava:2.1.0' 

    //rx java 
    compile 'io.reactivex:rxjava:1.1.6' 
    compile 'io.reactivex:rxandroid:1.2.1' 

//dagger2 
    compile 'com.google.dagger:dagger:2.0' 
    provided 'org.glassfish:javax.annotation:10.0-b28' 

Может ли кто-нибудь увидеть проблему здесь?

+0

ли вы создать компонент интерфейс, который обрабатывает инъекции? Если нет, сообщите мне, и я счастлив привести пример. – jch000

+0

Вы должны показать свои зависимости от градиента – EpicPandaForce

+0

Да, у меня есть компонентный интерфейс с AppModule и методы, в которых презентатор вводится void inject (приложение App); void inject (активность JokeActivity); void inject (активность JokeListActivity); void inject (диалог JokeDialog); – joe

ответ

4

Посмотрите на реализацию:

@Module(includes = InteractorModule.class) 
public class PresentationModule 

и

@Module(includes = {NetworkModule.class, PresentationModule.class}) 
public class InteractorModule 

У вас есть циклическую зависимость. Вам нужно переосмыслить свой дизайн. Я предлагаю отделить Interactor от Presenter.

Простое решение:

Изменить getRandomJoke() реализация вернуться Observable и подписаться на него внутри Presenter. И удалите presenter с Interactor.

Interactor:

public class JokeInteractorImpl implements JokeInteractor { 

    private RetrofitService retrofitService; 

    public JokeInteractorImpl(RetrofitService service) { 
     this.retrofitService = service; 
    } 

    @Override 
    public Observable getRandomJoke() { 
     return retrofitService.getRandomJoke() 
      .subscribeOn(Schedulers.io()) 
      .observeOn(AndroidSchedulers.mainThread()); 
    } 
} 

Presenter:

@Override 
public void getRandomJoke() { 
    mJokeView.showProgress(); 
    jokeInteractor.getRandomJoke() 
      .subscribe(new Observer<RandomJokeResponse>() { 
       @Override 
       public void onCompleted() { 
        onRandomJokeCompleted(); 
       } 

       @Override 
       public void onError(Throwable e) { 
        onError(e.getMessage()); 
       } 

       @Override 
       public void onNext(RandomJokeResponse randomJokeResponse) { 
        onNextRandomJoke(randomJokeResponse); 
       } 
      }); 
} 
+0

Это похоже на отличное решение, оно исправило мою проблему! Ты, привет! – joe