Je suis nouveau à Dagger2 et j'essaie d'utiliser l'injection de dépendance dans mon application. J'utilise des préférences partagées et je pensais qu'il serait plus utile d'utiliser l'injection de dépendance au lieu d'avoir une instance de préfrences partagées chaque fois que je dois l'utiliser. Cela fonctionne très bien quand je l'utilise sur des activités et des fragments, mais quand j'essaie de l'utiliser sur le service ou intentservice cela ne fonctionne pas.Android Dagger2 dépendance injection
Voici mon code:
AppModule:
@Module
public class AppModule
{
public final ApplicationClass application;
public AppModule(ApplicationClass application)
{
this.application = application;
}
@Provides @Singleton
Context providesApplicationContext()
{
return this.application;
}
@Provides @Singleton
SharedPreferences providesSharedPreferences()
{
return application.getSharedPreferences(Constants.FILE_NAME,Context.MODE_PRIVATE);
}
}
AppComponent
@Singleton @Component(modules = {AppModule.class})
public interface AppComponent
{
void inject (ApplicationClass applicationClass);
void inject (IntentService intentService);
void inject (Service service);
}
ApplicationClass
public class ApplicationClass extends Application
{
AppComponent appComponent;
@Override
public void onCreate()
{
super.onCreate();
Thread.setDefaultUncaughtExceptionHandler(new
Thread.UncaughtExceptionHandler() {
@Override
public void uncaughtException(Thread t, Throwable e) {
onUncaughtException(t, e);
}
});
appComponent = DaggerAppComponent
.builder()
.appModule(new AppModule(this))
.build();
appComponent.inject(this);
}
public AppComponent getAppComponent()
{
return this.appComponent;
}
private void onUncaughtException(Thread t, Throwable e)
{
e.printStackTrace();
Intent crash= new Intent(getApplicationContext(),Crash.class);
about.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(crash);
}
}
J'ai donc essayé d'injecter les préférences partagées dans IntentService et moi ces lignes de code dans la méthode onCreate du mon service (intentservice)
@Inject
SharedPreferences preferences;
@Override
public void onCreate()
{
super.onCreate();
((ApplicationClass)getApplication()).getAppComponent().inject(this);
}
Mais le problème est quand j'utilise ce préférences variable dans la méthode onHandleIntent
, l'application plante parce que les préférences sont nulles .. Alors pourquoi ne pas injecter?
Vous n'avez pas besoin d'injecter le contexte et les préférences partagées dans IntentService, IntentService a déjà hérité de Context. Votre problème est que vous devriez utiliser le nom de la classe cible (dans la méthode d'injection) dans AppComponent par exemple: 'void inject (ApplicationClass applicationClass); void injecter (CustomIntentService intentionService); void injecter (service SimpleIntentService); ' – Onregs
Vous devez spécifier une ** classe concrète spécifique ** et non sa classe parente pour y injecter. Donc, vous ne pouvez pas simplement dire 'IntentService' et injecter dans n'importe quel service d'intention, ce sera null parce que votre classe n'est pas' IntentService', c'est 'WhateverService'. – EpicPandaForce
@VadimKorzun merci comme vous pouvez le voir, je voulais dire des préférences partagées et édité ma question. Merci pour votre clarification sur mon problème – Elior