我在我的应用中使用 Dagger 。
正如文档所述,我将Application
类作为private
static
类成员进行实例化,并通过我需要的getter
获取它。
private void initDagger() {
appComponent = DaggerAppComponent
.builder()
.appModule(new AppModule(this))
.build();
}
但有时从getter
拨打SplashActivity
时(这是我的启动器Activity
)appcomponent
为空,所以当我获得NullpointerException
时尝试将SplashActivity
注入Dagger。
我无法重现这个问题,但我可以在Crashlytics中重现。
如果用户没有关闭应用程序,但很长一段时间后返回,可能会发生这种情况。在这种情况下,我再次调用SplashActivity
并清除堆栈,因为我必须重新启动一些我可以在这里做的事情。也许这就是appcomponent
为空时的观点。
我只能在SplashActivity
和Android 7.x(以及一些6.x)中看到此问题。
现在我尝试让appcomponent
像单身人士一样
public static AppComponent initDaggerAndGet(IndexApplication application){
if(appComponent == null){
synchronized (lock){
if(appComponent==null)appComponent = DaggerAppComponent
.builder()
.appModule(new AppModule(application))
.build();
}
}
return appComponent;
}
当我在SplashActivity
得到它并且我重构initDagger()
这样的方法时
private void initDagger() {
initDaggerAndGet(this);
}
正如我所写的那样,我无法重现这个问题,而且在SO上找不到这样的问题。 您认为可能是什么问题?重构的初始化会解决吗? 谢谢!
答案 0 :(得分:0)
最后我能够重现这个问题。 我启动了我的应用程序,而不是其他很多我的应用程序被杀死了。此时,如果我从任务管理器或启动器图标启动我的应用程序,我会收到此异常。 Application类中Appcomponent的私有静态实例为null。 所以现在我重构了我的AppComponent getter,我觉得它就像一个像这样的单身人士
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;
}
而不是在Appliaciton的onCreate()中初始化AppComponent,现在它可以工作。