Dagger-如何在服务和片段之间共享提供的对象?

时间:2019-03-23 04:14:36

标签: android dagger

我正在尝试通过此模块提供CarFactory,以便可以在CarFactoryService之间使用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注入到ServiceFragment中-基本上在两个不同的范围内共享一个对象?如果我在@FragmentScope下添加@ServiceScope,它会显示Cannot use more than one @Scope ...

我是否必须将其设置为@ApplicationScope才能通过Service和Fragment进行访问??

1 个答案:

答案 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始终获得相同的实例。因此,重要的是最小化您在这些广泛范围内的内容,以保持较低的内存使用量。