Dagger 2 Scopes, где разместить презентеров?

как лучше всего размещать докладчиков в области видимости?

Можем ли мы иметь докладчиков на @Singleton или @AppScope без каких-либо проблем?

Должны ли они быть помещены в @ActivityScope, чтобы уничтожать их каждый раз, когда активность уничтожается?


person Jose M Lechon    schedule 08.06.2017    source источник
comment
На днях я написал аналогичный ответ о сохранении докладчиков и проблемах, связанных с областями действия, вы можете посмотреть здесь stackoverflow. com/a/44398997/1837367   -  person David Medenjak    schedule 08.06.2017
comment
Действительно хорошо объясненный ответ. В настоящее время я сталкиваюсь с проектом, в котором есть докладчики на @Singleton, и лично мне это не нравится. Вот почему я задал этот вопрос. Еще один вопрос: когда у нас есть Scopes, все ли поставщики этой области инициализируются при ее создании?   -  person Jose M Lechon    schedule 08.06.2017


Ответы (1)


как лучше всего размещать докладчиков в области видимости?

Обычно докладчик должен находиться в некоторой области действия. Отсутствие его в какой-либо области приведет к проблемам, так как каждый раз, когда вы запрашиваете докладчика, он будет создавать новый.

Какую область вы выберете, в основном зависит от вашего стиля программирования, но наиболее распространенным, вероятно, будет @PerActivity как область, которая следует за жизненным циклом действия. (так же, как вы можете использовать что-то вроде @PerFragment с фрагментами и их жизненным циклом)

Можем ли мы иметь докладчиков на @Singleton или @AppScope без каких-либо проблем?

Да и нет. Долгоживущие объекты, ссылающиеся на менее живущие (например, объект @Singleton, который ссылается на объект с жизненным циклом активности), обычно не являются хорошей практикой, поскольку могут привести к утечкам памяти.

Вы можете избежать этих проблем, правильно добавляя/удаляя объекты с более коротким сроком службы (например, добавляя в onCreate, удаляя в onDestroy) или используя WeakReference.

Некоторые программисты сохраняют своих докладчиков как @Singleton или каким-то подобным образом и меняют представления, но опять же это зависит от того, как вы предпочитаете свой код. Это будет работать, но вы должны убедиться, на какие объекты вы ссылаетесь, и потом очистить.

Должны ли они быть помещены в @ActivityScope, чтобы уничтожать их каждый раз, когда активность уничтожается?

Это, безусловно, самый простой вариант, поскольку у вас не возникнет проблем со ссылкой на действие или что-либо еще, что от него зависит. Таким образом, вам, скорее всего, не придется беспокоиться об утечках памяти или других проблемах.


В конце концов, это ваш код, и вы должны делать то, что лучше работает для вас.

person David Medenjak    schedule 08.06.2017
comment
спасибо за ваш подробный ответ. Я всегда работал с подходом @ActivityScope, поэтому у меня были сомнения по поводу того, чтобы все докладчики были в одной области. - person Jose M Lechon; 09.06.2017