2017-08-16 1 views
-1

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!

+0

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. –

Répondre

0

Finalement, j'ai été capable de reproduire le problème. J'ai commencé mon application, que beaucoup d'autres encore mon application a été tué. À ce moment, si j'ai démarré mon application à partir du gestionnaire de tâches ou de l'icône du lanceur, j'obtiens cette exception. L'instance statique privée de Appcomponent dans ma classe Application était null. Alors maintenant, je me AppComponent getter remaniée avec, je reçois comme un Singletone comme celui-ci

public static AppComponent getAppComponent() { 
    Logger.logAppComponent(""); 
    if (appComponent == null) { 
     Logger.logAppComponent("AppComponent is null"); 
     synchronized (lock) { 
      if (appComponent == null) { 
       Logger.logAppComponent("Create still null, so create new AppComponent"); 
       appComponent = DaggerAppComponent 
         .builder() 
         .appModule(new AppModule(getApplication())) 
         .build(); 
      } 
     } 
    } 
    Logger.logAppComponent("Return AppComponent"); 
    return appComponent; 
} 

plutôt que onCreate() d'INIT AppComponent dans Appliaciton, et maintenant il fonctionne.