2016-12-06 3 views
0

개조 2, 단검 2 및 MVP가있는 간단한 앱을 만들려고합니다.하지만 실제로는 의존성으로 인해 어려움을 겪고 있습니다. 다시 작성하려고하면 오류가 발생합니다. 프로젝트 오류 : ': app : compileDebugJavaWithJavac'작업 실행에 실패했습니다.단검 2는 심볼 'DaggerAppComponent'를 해결할 수 없습니다.

java.lang.StackOverflowError

또한 내가 AppComponent을 제공하는 앱 클래스 : 해결할 수없는 기호 'DaggerAppComponent'가

가 내가 그렇게 사람이 문제를 볼 수 있습니다처럼 내 프로젝트는 모습을 보여하려고합니다

, 먼저 하나입니다 PresentationModule.class을 포함 내 AppModule

@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 :

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을 종속하십시오 RetrofitService 및 JokePresenter 참조가

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 :

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

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

이 도면을 참조하면과 인터랙을 갖는다 JokePresenter 인 :

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

당신의 gradle 의존성을 보여줘야합니다 – EpicPandaForce

+0

예, 저는 AppModule을 가진 컴포넌트 인터페이스와 발표자가 void injection (App app)으로 주입되는 메소드를 가지고 있습니다; void inject (JokeActivity activity); void inject (JokeListActivity activity); void inject (JokeDialog 대화 상자); – joe

답변

4

봐는 :

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

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

당신은 순환 종속성이. 디자인을 재고해야합니다. 나는 InteractorPresenter에서 분리 할 것을 제안합니다.

간단한 해결책 :

변경 getRandomJoke() 구현 Observable을 반환하고 Presenter 내부 그것에 가입. presenter 참조를 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()); 
    } 
} 

발표자 :

@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