SplashActivity中的Dagger为空

时间:2017-08-16 10:14:05

标签: android dagger-2 dagger

我在我的应用中使用 Dagger 。 正如文档所述,我将Application类作为private static类成员进行实例化,并通过我需要的getter获取它。

    private void initDagger() {
    appComponent = DaggerAppComponent
            .builder()
            .appModule(new AppModule(this))
            .build();
}

但有时从getter拨打SplashActivity时(这是我的启动器Activityappcomponent为空,所以当我获得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上找不到这样的问题。 您认为可能是什么问题?重构的初始化会解决吗? 谢谢!

1 个答案:

答案 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,现在它可以工作。