2017-10-29 5 views
0

I Dolch für Dependency Injection bin mit „contactServiceModule muss DaggerAppComponent $ Builder.build (DaggerAppComponent.java) eingestellt werden“, ich nicht tauchen entschuldigen in tiefe und immer meine Hände auf :) Ich verwende zwei Module (ApplicationModule, ContactServiceModule) mit einer Komponente (AppComponent). Ich habe den Dolch in App.java initialisiert, und ich versuche, Abhängigkeiten zu einem Hintergrunddienst zu injizieren. Hier ist das Code-Snippet. 1) ApplicationModule.javaDagger Dependency Injection zu Dienst nicht mit

@Module 
public class ApplicationModule { 
    private final App mApp; 
    private Service contactService; 

    public ApplicationModule(App app) { 
     mApp = app; 
    } 

    @Provides 
    @Singleton 
    public ContactModel contactModel(SQLiteDatabase database) { 
     return new ContactModel(mApp, database); 
    } 

    @Provides 
    @Singleton 
    public Context appContext() { 
     return mApp; 
    } 

    @Provides 
    @Singleton 
    public ContactController contactController() { 
     return new ContactController(mApp.getAppComponent()); 
    } 
    //.....Some more code 
} 

2) ContactServiceModule.java

@Module 
public class ContactServiceModule { 

    ContactService contactService; 

    public ContactServiceModule(ContactService contactService){ 
     this.contactService =contactService; 
    } 

    @Provides 
    @Singleton 
    ContactService provideContactService() { 
     return this.contactService; 
    } 
} 

3) AppComponent.java

@Singleton 
@Component(modules = {ApplicationModule.class,ContactServiceModule.class}) 
public interface AppComponent { 


    ContactController contactController(); 

    Context appContext(); 
    //...Some code 
    void inject(ContactController contactController); 
    //...Some code 
    void inject(ContactService contactService); 
} 

4) App.java

public class App extends Application { 
    private AppComponent mAppComponent; 
    @Override 
    public void onCreate() { 
     super.onCreate(); 
     FlowManager.init(this); 
     mAppComponent = DaggerAppComponent.builder() 
       .applicationModule(new ApplicationModule(this)) 
       .build(); 
    } 

    public AppComponent getAppComponent() { 
     return mAppComponent; 
    } 
} 

5) ContactService.jav a

public class ContactService extends Service { 

    @Inject 
    Context appContext; 

    @Inject 
    ContactController contactController; 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     getAppComponent().inject(this); 
    } 

    private AppComponent getAppComponent() { 
     return ((App)getApplication()).getAppComponent(); 
    } 

} 

Es könnte ein Problem der Abhängigkeiten von UI-Threads sein, die in Hintergrunddienste eingespeist werden. Aber ich verstehe nicht, wie ich die gleichen Abhängigkeiten erreichen soll, um in Dienste eingefügt zu werden. Oder wie sollte der ideale Weg sein, um zwischen Abhängigkeiten und Diensten auf Anwendungsebene zu kommunizieren. Ich möchte der Service immer im Hintergrund ausgeführt werden, und das Hören zu verschiedenen Absichten und kommunizieren auch auf andere Abhängigkeiten wie EventBus usw.

+1

Ich sehe nicht, Sie rufen 'neue ContactServiceModule (Service)' und fügen Sie es an der Komponente überall –

Antwort

1

Die Fehlermeldung:

contactServiceModule muss DaggerAppComponent $ Builder.build eingestellt werden (DaggerAppComponent.java)“

bedeutet, dass Sie ein Modul mit Abhängigkeiten im Konstruktor erstellt haben (ContactServiceModule die Ihre Service als Parameter im Konstruktor hat). Daraus folgt, dass Dagger 2 nicht das Modul automatisch instanziiert und es muss im Builder instanziiert werden, wenn Sie die Komponente erstellen:

mAppComponent = DaggerAppComponent.builder() 
       .applicationModule(new ApplicationModule(this)) 
       .contactServiceModule(contactService); 
       .build(); 

Allerdings gibt es ein zugrunde liegendes Problem mit der Architektur, die Sie versuchen, zu erstellen. Dienste, wie z. B. Aktivitäten, sind so konzipiert, dass sie vom Android-Betriebssystem unabhängig und instanziiert werden. Ähnlich wie Sie eine Aktivität nicht direkt als eine Abhängigkeit an eine andere Aktivität übergeben würden, sollten Sie einen Dienst nicht als Abhängigkeit definieren. Stattdessen müssen Sie Intent, Service Binding oder EventBus-Ereignisse verwenden, um mit dem Dienst zu kommunizieren. Die Android Service Dokumentation deckt dies ab und Sie sollten es sorgfältig lesen, bevor Sie fortfahren.

+0

Vielen Dank für die Erklärung. Wie kann ich die EventBus-Instanz in den Dienst einfügen? EventBus ist eine Singleton-Abhängigkeit, und ich möchte, dass diese in den Service eingefügt wird. – vivek