我正在尝试通过此模块提供CarFactory
,以便可以在CarFactory
和Service
之间使用Fragment
对象。
@Module(includes = UnscopedModule.class)
public final class ThisModuleModule {
@Provides
@ServiceScope
static CarFactory provideCarFactory() {
return new CarFactory();
}
@Provides
@ServiceScope
static String provideReferrer() {
return "referrer";
}
}
对于初始实现,我可以将CarFactory
注入到Service
中,但是显然我不能将其注入到Fragment
中,因为provideCarFactory
已绑定到@ServiceScope。我如何才能将CarFactory
注入到Service
和Fragment
中-基本上在两个不同的范围内共享一个对象?如果我在@FragmentScope
下添加@ServiceScope
,它会显示Cannot use more than one @Scope
...
我是否必须将其设置为@ApplicationScope才能通过Service和Fragment进行访问??
答案 0 :(得分:1)
是的,我建议将其设置为@ApplicationScope。
当您阅读“范围”时,将其视为“由Dagger管理的生命周期”:@FragmentScope意味着只要Fragment存在,Dagger就会使您的对象保持活动状态,并且每个新的Fragment实例都会获得每个@FragmentScope的新副本。事情。对于@ServiceScope也是如此:每个Service实例都将存在一个@ServiceScope对象或绑定,并且理想情况下,一旦服务被破坏,将被垃圾回收。当然,就Android而言,Fragments和Services可以具有彼此不相关的重叠生命周期。
由于这个原因,同时将@FragmentScope和@ServiceScope都变得没有意义:您希望对象的生存时间比Fragment和Service都长,以便共享两者之间。通常,这意味着您希望它位于@Singleton范围内,为此@ApplicationScope通常是Dagger中的同义词。
请注意,这意味着@Singleton或@ApplicationScope中的对象将永远不会被垃圾收集,因为Dagger会将它们保留足够长的时间,以使Fragment和Service始终获得相同的实例。因此,重要的是最小化您在这些广泛范围内的内容,以保持较低的内存使用量。