IllegalArgumentException в OTTO при отмене регистрации фрагмента

Я использую шину Отто для передачи событий от активности к фрагментам. Проблема в том, что фрагменты управляются ViewPager, и фрагмент может быть воссоздан без выполнения его onPause() и/или onResume(). Неприятным побочным эффектом этого является то, что когда bus.unregister(fragment) вызывается в onPause(), вызов периодически завершается с ошибкой IllegalArgumentException. Я также подозреваю, что вызовы моего аннотированного метода @Subscribe могут быть пропущены, поскольку вызов bus.register() находится в методе onResume(), который также можно не вызывать. И, к сожалению, нет bus.isRegistered(fragment) метода безопасной проверки.

Есть ли лучший способ зарегистрировать/отменить регистрацию управляемого фрагмента ViewPager?

Мне известно об этом сообщении, в котором обсуждается аналогичная установка. но он не включает фрагменты, запущенные в ViewPager


person Bostone    schedule 06.02.2013    source источник
comment
Какой фрагментный пейджер вы используете? FragmentPagerAdapter или FragmentStatePagerAdapter? Я спрашиваю, потому что я перешел на этот метод регистрации в onResume и отмены регистрации в onPause и не заметил ни одного из побочных эффектов, которые вы описываете с помощью FragmentStatePagerAdapter.   -  person Nick Campion    schedule 07.02.2013
comment
Кроме того, может быть, некоторая информация о том, что вы видите, указывает на «воссоздание» в строке «фрагмент может быть воссоздан без выполнения его onPause или onResume ()»? Я действительно не уверен, что будет означать отдых без этих звонков или как вы его обнаружите.   -  person Nick Campion    schedule 07.02.2013
comment
Я использовал FragmentPagerAdapter, когда писал вопрос. Тестирование сейчас с FragmentStatePagerAdapter. Когда я говорю об отдыхе, я действительно имею в виду, что старый объект Fragment можно выбросить и, казалось бы, заменить другим, поэтому, например, я научился ничего не сохранять как поле во Fragment. Похоже, то же самое относится и к onPause/onResume. Есть несколько вопросов, в которых упоминается отсутствие этих вызовов при работе с ViewPager и фрагментами.   -  person Bostone    schedule 07.02.2013
comment
Я не уверен, но это звучит подозрительно. Мое понимание и то, что, по-видимому, имеет место в моей кодовой базе, заключается в том, что когда выгружаемые фрагменты уходят за пределы экрана, они проходят через свои стандартные вызовы жизненного цикла для отсоединения. Глядя на исходный код FragmentPagerAdapter.destroyItem(), есть вызов FragmentTransaction.detach, который заставит фрагмент пройти свой жизненный цикл. Я предполагаю, что вы регистрируете onPause on Resume с распечаткой this, чтобы вы могли видеть идентификатор объекта фрагментов, выполняющих вызовы?   -  person Nick Campion    schedule 07.02.2013
comment
Для справки я создал этот суть, который показывает вывод в моем журнале cat одного журнала. d в onResume и onPause, когда я пролистываю свои фрагменты. Я запускал этот тест несколько раз на разных скоростях с тем же результатом. Я аннотировал вывод журнала знаком (››) и своим взаимодействием с пользователем, чтобы вы могли понять, что я делал.   -  person Nick Campion    schedule 07.02.2013
comment
@NickCampion, как это поможет мне справиться с этой довольно конкретной проблемой? До сих пор - я шлепнул try/catch по проблемному коду, но это просто маскирует проблему.   -  person Bostone    schedule 07.02.2013
comment
Думаю, я пытаюсь предположить, что проблема может быть где-то еще. Я видел подобные проблемы, когда у меня были фрагменты внутри фрагментов или ViewPager во фрагменте. Вы обновились до последней библиотеки поддержки? Думаю, я пытаюсь подтвердить для вас, что не могу воспроизвести проблему, поэтому могут быть другие ситуационные факторы, вызывающие то, что вы видите.   -  person Nick Campion    schedule 07.02.2013
comment
Ты прав Ник. Оказывается, я полный идиот, который забыл, что у меня уже есть регистрация/отмена регистрации в абстрактном классе, из которого я получаю свой фрагмент. Таким образом, отмена регистрации выполняется дважды, и это является источником сбоя. Большое спасибо, что заставили меня задуматься!   -  person Bostone    schedule 08.02.2013


Ответы (1)


Если вы пришли сюда, потому что у вас похожая проблема - оказывается (спасибо Nick Campion за указание на это), нет ничего плохого в onPause\onResume в моем фрагменте. Я просто дважды вызывал register/untegister: один раз в родительском абстрактном классе и еще один в дочернем. Как в class MyFragment extends AbsFragment. Так что, возможно, посмотрите на свой код

person Bostone    schedule 07.02.2013