我正在使用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 这可能是您的解决方案。
答案 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
。