Dagger 2:DaggerBroadcastReceiver 重新创建 Subcomponent
Dagger 2: DaggerBroadcastReceiver recreates Subcomponent
假设我想要 SomeSingletonClass
的单个应用程序范围的实例。我创建了一个提供此类对象的 Dagger 模块:
@Module
public interface MyModule {
@Provider
@Singleton
SomeSingletonClass provideSomeSingletonClass() {
return new SomeSingletonClass();
}
我也想用BroadcastReciever:
public class MyReceiver extends DaggerBroadcastReceiver {
@Inject
SomeSingletonClass someSingletonClass;
@Override
public void onReceive(Context context, Intent intent) {
super.onReceive(context, intent);
...
}
}
它有自己的模块:
@Module
public abstract class MyReceiverModule {
@Singleton
@ContributesAndroidInjector(modules = {MyModule.class})
abstract MyReceiver myReceiver();
}
现在,每次调用 onReceive()
都会导致调用 super.onReceive()
,后者又会调用 AndroidInjection.inject(this, context)
。这会导致重新创建 MyReceiver
的子组件和关联的依赖项,包括 SomeSingletonClass
.
使用 DaggerBroadcastReceiver 时保留单例实例的正确方法是什么?
好的,我的问题是我将 @Singleton
添加到 @ContributesAndroidInjector
创建的子组件中。正如 gk5885 在 answer 中指出的类似问题:
@Subcomponents cannot be made @Singleton.
原因是,由于子组件可能会被组件重新创建,@Singleton 实例将只对子组件实例保持不变。解决方案是从子组件中删除 @Singleton
注释,并为根组件提供单例的移动模块,然后将其标记为 @Singleton
.
假设我想要 SomeSingletonClass
的单个应用程序范围的实例。我创建了一个提供此类对象的 Dagger 模块:
@Module
public interface MyModule {
@Provider
@Singleton
SomeSingletonClass provideSomeSingletonClass() {
return new SomeSingletonClass();
}
我也想用BroadcastReciever:
public class MyReceiver extends DaggerBroadcastReceiver {
@Inject
SomeSingletonClass someSingletonClass;
@Override
public void onReceive(Context context, Intent intent) {
super.onReceive(context, intent);
...
}
}
它有自己的模块:
@Module
public abstract class MyReceiverModule {
@Singleton
@ContributesAndroidInjector(modules = {MyModule.class})
abstract MyReceiver myReceiver();
}
现在,每次调用 onReceive()
都会导致调用 super.onReceive()
,后者又会调用 AndroidInjection.inject(this, context)
。这会导致重新创建 MyReceiver
的子组件和关联的依赖项,包括 SomeSingletonClass
.
使用 DaggerBroadcastReceiver 时保留单例实例的正确方法是什么?
好的,我的问题是我将 @Singleton
添加到 @ContributesAndroidInjector
创建的子组件中。正如 gk5885 在 answer 中指出的类似问题:
@Subcomponents cannot be made @Singleton.
原因是,由于子组件可能会被组件重新创建,@Singleton 实例将只对子组件实例保持不变。解决方案是从子组件中删除 @Singleton
注释,并为根组件提供单例的移动模块,然后将其标记为 @Singleton
.