Каковы недостатки подписки на Eventbus в классе приложений?
Я использую EventBus в моем приложении для Android. Это хорошая идея сделать Eventbus.getDefault().register(this)
в моем Application.onCreate()
? У меня нет обновлений пользовательского интерфейса. Я пытаюсь, чтобы убедиться, что я получаю данные подписки, даже если приложение переходит в фоновый режим. Могут быть и другие способы добиться того, чего я хочу, но мне любопытно, если что-то не так с этим подходом.
Мои сомнения:
Это вызовет какую-то утечку памяти? Eventbus ссылается на объект Application, а объект Application также полагается на Eventbus. Это выглядит циклично.
Когда отменить регистрацию? Application.onTerminate() не гарантированно вызывается. Если #1 не является проблемой, я думаю, что можно игнорировать отписку в классе Application.
2 ответа
Это вызовет какую-то утечку памяти? Eventbus ссылается на объект Application, а объект Application также полагается на Eventbus. Это выглядит циклично.
Совершенно нормально подписаться на события прямо из класса Application. ОС очистит Приложение, и EventBus является частью этого. Нет проблем.
Когда отменить регистрацию? Application.onTerminate() не гарантированно вызывается. Если #1 не является проблемой, я думаю, что можно игнорировать отписку в классе Application.
Да я бы тоже отписался на Terminate, просто для полноты. Но вы правы на устройстве Android, если приложение очищено, значит, все просто исчезло, поэтому нет необходимости "очищать".
Ваш класс Application будет убит, когда приложение физически остановится.
Что значит:
- Когда ОС решит физически остановить приложение (могут быть дни, когда это произойдет) или произойдет внешнее вмешательство (то есть пользователь остановит его или сделает такое служебное приложение, как Clean Master), приложение будет полностью остановлено и уничтожено.
- Любые статические ссылки также будут удалены из памяти (т. Е. Ваш одноэлементный EventBus).
(2) будет действительным, только если вы должным образом отмените регистрацию своих слушателей, т.е. отмените регистрацию действия / фрагмента, когда остановлено, или отмените регистрацию представления, когда View.onDetachedFromWindow (), и т. Д.
Пока в вашем методе обратного вызова события вы не пытаетесь запустить что-то в отдельном потоке или обновить несуществующее действие / представление / фрагмент, все будет в порядке.