Компонент Dagger2 как статическая глобальная переменная

В моем приложении для Android есть несколько действий. MainActivity создает компонент Dagger2 в своем методе onCreate() и присваивает его статической переменной, чтобы любой класс мог вызвать статический метод MainActivity.getDaggerComponent(), чтобы затем внедрить в себя зависимости.

Проблема, которую я обнаруживаю, заключается в том, что когда я запускаю свою VideoPlayerActivity, объект MainActivity иногда вызывает свой onPause(). В этом случае переменная статического компонента получает значение null. Позже VideoPlayerActivity необходимо внедрить свои зависимости, но компонента нет, поэтому все рушится.

Как обеспечить постоянную доступность компонента Dagger2 для всех действий?


person John D.    schedule 19.06.2015    source источник
comment
Инициализируйте его в классе Application или просто статически   -  person Dmitry Zaytsev    schedule 20.06.2015
comment
Мне нужна ссылка на MainActivity для передачи в конструктор компонента, поэтому я не думаю, что какой-либо из этих методов будет работать. Если бы мне не пришлось, они были бы идеальными.   -  person John D.    schedule 20.06.2015
comment
Тогда может случиться так, что вы делаете очень неправильную вещь, пытаясь использовать зависимости одного Activity в другом Activity. Это может привести к утечке памяти и, в частности, звучит как проблема дизайна. Не могли бы вы предоставить более подробную информацию о том, что вы на самом деле пытаетесь решить с помощью внедрения зависимостей?   -  person Dmitry Zaytsev    schedule 20.06.2015
comment
Я думаю, что вы правы, но я не уверен, как это решить. В качестве примера того, что я делаю, я хочу использовать один OkHttpClient во всей моей программе. Использование нескольких OkHttpClient может значительно замедлить работу, поэтому я хочу поделиться этим со всеми классами, которые делают запросы.   -  person John D.    schedule 20.06.2015
comment
Но для этого нет необходимости использовать ссылку Activity, верно?   -  person Dmitry Zaytsev    schedule 20.06.2015
comment
Это было просто для примера. Я использую активность для разных целей. Но я принял ваше предложение об инициализации в приложении, которое, похоже, помогло. Не похоже, что вы можете гарантировать, что статические переменные Activity останутся, поэтому уровень приложения — это путь. Если вы поместите свой ответ в качестве ответа, я приму его.   -  person John D.    schedule 23.06.2015


Ответы (1)


Инициализируйте компонент Dagger в классе Application или просто статически. Возможно, вы делаете очень неправильную вещь, пытаясь использовать зависимости одного действия в другом действии. Это может привести к утечке памяти и, в частности, звучит как проблема дизайна. Что, если ваш первый Activity уже уничтожен? Кто освободит инстанс Dagger? Почему граф принадлежит первому Activity, а не второму? Что, если пользователь войдет в ваше приложение со второго Activity - тогда первое даже не будет инициализировано. И так далее, и так далее.

Если вам по-прежнему нужен экземпляр Activity, вам следует использовать специальный компонент Activity внутри Activity, а все остальное переместить в глобальный (широкий Application) компонент.

person Dmitry Zaytsev    schedule 23.06.2015