#android #otto
#Android #otto
Вопрос:
У меня есть базовый фрагмент, который в своем методе onCreateView создает класс MyObject. Оба они находятся внутри ViewPager.
Два разных фрагмента простираются от BaseFragment
— FragmentA
, FragmentB
.
Это означает FragmentA
, FragmentB
что оба имеют свои собственные экземпляры объекта MyObject.
Внутри BaseFragment
я вызываю myObject.initialise();
MyObject
объект из onStart();
метода и cleanUp();
из onStop();
@Override
public void onStart()
{
super.onStart();
myObject.initialise();
}
@Override
public void onStop()
{
myObject.cleanUp();
super.onStop();
}
Опять же — это живет внутри BaseFragment
so обоих FragmentA
и FragmentB
имеет это в своем жизненном цикле.
Функции initialise(); и cleanUp(); выглядят следующим образом:
@Override
public void initialise()
{
BusManager.register(this);
}
@Override
public void cleanUp()
{
BusManager.unregister(this);
}
FragmentA
обычно сначала закрывается, и он успешно отменяет регистрацию. FragmentB
Однако при закрытии происходит сбой, поскольку он считает this
, что не был зарегистрирован.
Я проверил адрес памяти this
, и кажется, что он дважды пытается выполнить unregister
одно и то же.
Missing event handler for an annotated method. Is class com.example.app.MyObject registered?
Почему он это делает? Я убедился, что MyObject
это новый экземпляр.
Комментарии:
1. как насчет использования
onCreate()
вместоonStart()
и onDestroy() вместоonStop()
? Потому что onStop будет вызываться системой, когда мы переключаемся с родительского действия на другое действие. Кстати, возможно, вам нужно переключиться с ottoBus и вместо этого использовать EventBus . OttoBus теперь устарел.
Ответ №1:
Для приведенного выше комментария обратите внимание, что onDestroy() вызывается необязательно: https://developer.android.com/reference/android/app/Activity.html#onDestroy ()Вы не должны рассчитывать на это для вызова Otto register / unregister.
Что касается вопроса Subby: у меня были сценарии, в которых OnStart() / onStop() вызывались дважды. В итоге я разместил блок try-catch. Определенно не чистое решение, но именно так я и делаю, прежде чем выяснять, почему жизненный цикл испорчен.
Комментарии:
1. Он никогда не вызывается дважды. Он всегда вызывается один раз. Проблема в том, что
unregister(this);
вызов метода -> параметр «this», по-видимому, является экземпляром фрагмента, который я ранее не регистрировал.