Otto отменяет регистрацию того же экземпляра

#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», по-видимому, является экземпляром фрагмента, который я ранее не регистрировал.