J'utilise Dagger dans mon application. Comme le dit la documentation, je l'instaure dans ma classe Application
en tant que membre de la classe static
, et l'obtiens par un getter
là où j'en ai besoin.Dagger est null à SplashActivity
private void initDagger() {
appComponent = DaggerAppComponent
.builder()
.appModule(new AppModule(this))
.build();
}
Mais parfois, lorsque l'appel getter
de mon SplashActivity
(ce qui est mon lanceur Activity
) appcomponent
est nulle, donc je reçois un NullpointerException
lorsque je tente d'injecter SplashActivity
dans Dagger. Je ne peux pas reproduire ce problème, mais je le peux dans Crashlytics. Cela peut arriver si l'utilisateur ne ferme pas l'application, mais revient après un long moment. Dans ce cas, j'appelle à nouveau le SplashActivity
et je vide la pile, parce que je dois réinjecter certaines choses que je peux faire ici. Peut-être que c'est le moment où le appcomponent
sera nul. Je peux voir ce problème en seulement SplashActivity
et seulement Android 7.x (et certains 6.x). Maintenant, je essayer d'obtenir appcomponent
comme un Singletone
public static AppComponent initDaggerAndGet(IndexApplication application){
if(appComponent == null){
synchronized (lock){
if(appComponent==null)appComponent = DaggerAppComponent
.builder()
.appModule(new AppModule(application))
.build();
}
}
return appComponent;
}
quand je l'obtiens au SplashActivity
et je refactorisons méthode initDagger()
comme ce
private void initDagger() {
initDaggerAndGet(this);
}
Comme je l'ai écrit, je ne peux pas reproduire le problème, et je ne peux pas trouver quelque chose comme ce problème à SO. Que pensez-vous que peut être le problème? L'initalisation refactorisée le résoudra-t-elle? Merci!
Veuillez inclure _all_ du code pertinent affecté ainsi que l'erreur et la trace de pile réelle. Ma conjecture serait que l'activité a été détruite et recréée, et vous ne recréerez pas le composant pour une raison quelconque. –