2017-07-27 4 views
3

Je l'ai regardé les bases ainsi que la classe, mais être de nouveau à poignard (ou même poignard 2) Je ne sais pas comment je suppose d'utiliser cetteComment mettre en œuvre DaggerService

Voici le service intention de poignard: https://google.github.io/dagger/api/latest/dagger/android/DaggerIntentService.html

Je comprends le service intention android et les bases pour la mise en œuvre, mais je ne peux pas sembler trouver des informations sur le DaggerIntentService (et je lutte aussi à trouver des informations pour DaggerService)

Mon L'objectif est de le construire en utilisant TDD, mais j'ai juste besoin de comprendre le workflow pour implémenter un service basé sur le poignard

Merci, Kelly

Répondre

3

Cela ne répond pas au problème DaggerIntentService, sur le but. dagger.android Les packages plus ou moins font la même chose que vous pouvez faire manuellement en définissant le composant et le module appropriés pour le service Intent. Donc, vous pouvez essayer l'approche suivante:

ServiceComponent

@Subcomponent(modules = ServiceModule.class) 
public interface ServiceComponent{ 

    @Subcomponent.Builder 
    public interface Builder { 
     Builder withServiceModule(ServiceModule serviceModule); 
     ServiceComponent build(); 
    } 

    void inject(MyService myService); 
} 

ServiceModule

@Module 
public class ServiceModule{ 

    private MyService myService; 

    public ServiceModule(MyService myService){ 
     this.myService = myService; 
    } 

    @Provides public MyService provideServiceContext(){ 
     return myService; 
    } 

    @Provides public SomeRepository provideSomeRepository(){ 
     return new SomeRepository(); 
    } 
} 

Ayant à l'esprit que vous avez composant poignard racine, par exemple ApplicationComponent que vous instancier dans la méthode d'application onCreate(), vous ll aura besoin d'une méthode publique supplémentaire dans votre classe d'application.

ApplicationComponent

@Component(modules = ApplicationModule.class) 
public interface ApplicationComponent{ 
    ServiceComponent.Builder serviceBuilder(); 
} 

ApplicationModule

@Module(subcomponents = ServiceComponent.class) 
public class ApplicationModule{ 

    public ApplicationModule(MyApplication myApplication){ 
     this.myApplication = myApplication; 
    } 

    @Provides 
    public MyApplication providesMyApplication(){ 
     return myApplication; 
    } 
} 

MyApplication

public class MyApplication extends Application{ 

    ApplicationComponent applicationComponent; 

    @Override 
    public void onCreate(){ 
     super.onCreate(); 
     applicationComponent = DaggerApplicationComponent.builder() 
      .applicationModule(new ApplicationModule(this)) 
      .build(); 
    } 

    public ServiceComponent getServiceInjector(MyService myService){ 
     return applicationComponent.serviceBuilder().withServiceModule(new ServiceModule(myService)).build(); 
} 

Enfin, votre MyService :)

MyService

public class MyService extends IntentService{ 

    @Inject MyApplication application; 
    @Inject SomeRepository someRepository; 

    public onCreate(){ 
     ((MyApplication)getApplicationContext()).getServiceInjector(this).inject(); 
    } 

    public void onHandleIntent(Intent intent){ 
     //todo extract your data here 
    } 

Cela peut sembler compliqué au premier abord, mais si vous avez la configuration de la structure de poignard déjà, ses seulement deux à trois classes supplémentaires.

J'espère que cela vous sera utile. À la vôtre.

+0

Merci pour la panne @bajicdusko, et je suis encore un peu perdu. 1. votre service est implémenté à partir de Service au lieu de DaggerService ou DaggerIntentService, alors en quoi cette implémentation diffère-t-elle? 2. Si le flux d'injection est le même que l'utilisation d'un DaggerService, alors pourquoi ne pas faire l'injection du constructeur? – KellyTheDev

+0

@KellyTheDev L'implémentation ci-dessus n'utilise pas DaggerService, ni DaggerIntentService. Ces deux classes font partie de dagger.android, qui n'est pas utilisé ci-dessus. Ce que nous avons fait ci-dessus est presque la même chose que ces deux classes le feraient, mais manuellement, pour montrer le flux de travail. En ce qui concerne l'injection, j'espère avoir compris votre question -> Les services ne peuvent pas utiliser l'injection du constructeur car vous n'instanciez pas les services via ses constructeurs. Même dans la classe DaggerService, la description indique "Un service qui injecte ses membres dans onCreate()". Vous pouvez utiliser const.injection sur SomeRepository d'en haut, cependant. – bajicdusko

+0

OK, je pense que je suis avec vous sur ce @bajicdusko (merci encore BTW). Donc tout ce qui est au-dessus est manuel, cela dit que je devrais 1. implémenter DaggerIntentService 2. Faire l'injection de propriété comme '@Inject SomeRepository someRepository;' (qui injecte/wires-up à onCreate()). 3a. Si j'ai besoin d'une référence ApplicationClass spécifique, remplacez la méthode onCreate comme indiqué ci-dessus. 4. Faites des choses avec onHandleIntent() – KellyTheDev