#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 сохранит их достаточно долго, чтобы ваш фрагмент и служба всегда получали один и тот же экземпляр. Следовательно, важно свести к минимуму то, что вы вкладываете в эти широкие области, чтобы снизить потребление памяти.