2015-01-23 2 views
4

Я использую EventBus для Greenrobot в своем приложении, и он отлично работает.События, принимаемые несколько раз - Greenrobot eventbus

Однако, если я нажмем кнопку «Назад», чтобы закрыть приложение, перезагрузите приложение мгновенно, я, похоже, получу событие дважды. Если я сделаю это снова, я получу его три раза и так далее.

Я проверяю журналы и отладки, чтобы увидеть, есть ли у меня несколько экземпляров любых классов или если я регистрирую несколько раз, но я не вижу никаких дополнительных классов и использование isRegistered возвращает false.

Любые идеи?

Thanks

+0

Вы можете оставить свой код? –

+1

Я согласен с crazymaik - похоже, что у вас отсутствует вызов 'unregister()' где-то. Имейте в виду, что кнопка BACK не «закрывает приложение», поскольку ваш процесс по-прежнему находится вокруг, по крайней мере на некоторое время. BACK просто разрушает работу переднего плана. – CommonsWare

ответ

9

Действительно ли ваши регистровые/незарегистрированные вызовы парятся правильно? Например. если вы register() в Activity.onResume(), вы звоните unregister() в Activity.onPause().

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

+0

Я думаю, что вы правы, я сделал grep, и мои регистры превосходят числитель моих незарегистрированных пользователей. Однако я не уверен, правильно ли я использую это. Теперь я должен определенно добавить дополнительную информацию к вопросу изначально. Я пытаюсь написать игру с помощью LibGDX, которая написана в значительной степени на чистой Java. В этом повторении я не использую Action/Fragments как таковой, и, возможно, я злоупотребляю eventbus. Я использую его в обычных классах Java. Я регистрируюсь в конструкторе, но я не знаю, где поставить незарегистрированный. Я не знаю метода, который вызвал вызов GC класса? –

+0

Я только что добавил вызов isRegistered в классе, который я не регистрирую, и я получаю false, что бы сказать, что он еще не зарегистрирован? Или это ложь, и теперь есть два класса в куче, старый, все еще зарегистрированный, и этот новый? –

+0

Думаю, у меня есть работа. Я добавил метод под названием unRegister() во всех моих классах, которые использовали EventBus, и которые не были действительными или у которых не было метода LibGDX dispose(). Тогда мне пришлось тщательно следить за тем, чтобы все было незарегистрировано, когда игра была закрыта. Кажется, что работает, но я вернусь к вам, если это не так. Спасибо всем –

2

Это старый, но на всякий случай у кого-то есть эта проблема: слегка протрите при использовании EventBus внутри динамически генерируемых вещей, таких как фрагменты или другие классы; Я не совсем понял, почему они отправляли на EventBus не один раз, но я думаю, что это связано с этим (у меня было более одного динамически созданного фрагмента). Он работал нормально, как только я положил register(), unregister(), onEvent() в родительский код активности (который также удобно использует onPause() и onResume()).

0

Проблема была не в том, что событие было фактически запущено несколько раз, , но что обработчик был вызван несколько раз. Как видно из приведенного выше кода, метод bus.register вызывается каждый раз, когда я создаю объект; из-за жизненного цикла действий это повторялось несколько раз, в результате чего обработчик вызывался несколько раз.

Смежные вопросы