使用dagger注入依赖项时出现ClassCastException

时间:2017-06-28 07:07:40

标签: android dagger-2 dagger

我正在使用Dagger2在我的所有应用程序中注入我的依赖项。

前几天我开始从三星Android 7.0(仅限这些)设备获取其中一个应用程序的崩溃报告。

java.lang.RuntimeException: 
  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2924)
  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2985)
..
Caused by: java.lang.ClassCastException: 
  at de.package.name.MyApplication.get(MyApplication.java:43)
  at de.package.name.ui.base.BaseActivity.onCreate(BaseActivity.java:53)
  at de.package.name.ui.startup.StartupActivity.onCreate(StartupActivity.java:26)
  at android.app.Activity.performCreate(Activity.java:6912)
  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1126)
  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2877)

MyApplication类:

public class MyApplication extends MultiDexApplication {

    private AppComponent appComponent;

    @Override
    public void onCreate() {
        super.onCreate();
        setupAppComponent();
    }

    private void setupAppComponent() {
        appComponent = DaggerAppComponent.builder()
                .appModule(new AppModule(this))
                .userApiModule(new UserApiModule())
                .build();
        appComponent.inject(this);
    }

    public static MyApplication get(Context context) {
        return (MyApplication) context.getApplicationContext();
    }
}

BaseActivity类的相关部分:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    MyApplication.get(this).getAppComponent().inject(this);
}

最后,StartupActivity Part:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setupComponent(MyApplication.get(this).getAppComponent());
    setContentView(R.layout.activity_startup);

    startupPresenter.bindView(this);
}

public void setupComponent(AppComponent appComponent) {
    startupComponent = DaggerStartupComponent.builder()
          .appComponent(appComponent)
          .startupModule(new StartupModule())
          .build();
    startupComponent.inject(this);
}

我已经将Dagger更新到最新版本(现在为2.11)。但我对这个问题没有任何想法。此外,我无法在我的三星S8 7.0设备上重现它。

所以,如果您有任何想法,请告诉我们!

干杯

修改 如果有人遇到这个问题。看看这里:RuntimeException with Dagger 2 on Android 7.0 and Samsung devices 这可能是您的解决方案。

1 个答案:

答案 0 :(得分:1)

这与Dagger无关。问题出在这里:

return (MyApplication) context.getApplicationContext();

Context返回的getApplicationContext() 保证是您的Application实例。我遇到的唯一情况是在模拟器中,但它始终是可能的。

我更喜欢这种方法:

private static MyApplication gInstance;

@Override
public void onCreate() {
    gInstance = this;
}

public static MyApplication instance() {
    return gInstance;
}

这是安全的,因为在创建任何其他Android组件之前,会创建Application实例并调用其onCreate