Dagger — как разделить предоставленный объект между сервисом и фрагментом?

#android #dagger

#Android #dagger

Вопрос:

Я пытаюсь предоставить 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, чтобы сделать его доступным как из сервиса, так и из фрагмента???

Ответ №1:

Да, я бы рекомендовал сделать это @applicationScope.

Когда вы читаете «область видимости», думайте об этом как о «жизненном цикле, управляемом Dagger»: @FragmentScope означает, что Dagger поддерживает ваш объект в рабочем состоянии до тех пор, пока существует фрагмент, и каждый новый экземпляр Fragment получает новую копию каждой вещи @FragmentScope. Аналогично для @ServiceScope: объект или привязка @ServiceScope будет существовать для каждого экземпляра сервиса и в идеале будет собран мусор после уничтожения сервиса. Конечно, что касается Android, фрагменты и сервисы могут иметь перекрывающиеся жизненные циклы, которые не привязаны друг к другу.

По этой причине не имеет смысла, чтобы что-то было одновременно @FragmentScope и @ServiceScope: вы хотите, чтобы объект жил дольше, чем и фрагмент, и Сервис, чтобы он был общим для них обоих. Обычно это означает, что вы хотите, чтобы он находился в области @Singleton, для которой @applicationScope часто является синонимом в Dagger.

Обратите внимание, что это означает, что объекты в @Singleton или @applicationScope никогда не будут собраны в мусор, потому что Dagger сохранит их достаточно долго, чтобы ваш фрагмент и служба всегда получали один и тот же экземпляр. Следовательно, важно свести к минимуму то, что вы вкладываете в эти широкие области, чтобы снизить потребление памяти.