Фрагмент не отвечает на обновления пользовательского интерфейса и события Eventbus после возобновления - PullRequest
5 голосов
/ 11 марта 2019

У меня есть класс SearchFragment, который расширяет класс с именем BaseFragment, в котором onResume и onStop переопределяются, как показано ниже:

@Override
public void onResume() {
  checkEventBusRegistration();
    super.onResume();
}
@Override
public void onStop() {
    EventBus.getDefault().unregister(this);
    super.onStop();
}
public void checkEventBusRegistration()
{
    if(!EventBus.getDefault().isRegistered(this))
    {
        EventBus.getDefault().register(this);
    }
}

SearchFragment - фрагмент, показывающий список результатов поиска. При нажатии на каждый элемент, деталь продукта отображается в другом фрагменте по телефону ниже:

getFragmentManager().beginTransaction().replace(R.id.container, new ProductDetailFragment()).addToBackStack(null).commit();

Кроме того, некоторые другие события в моем фрагменте не работают должным образом. Мой фрагмент имеет listView, который не отвечает на notifyDataSetChanged().

После возврата из ProductDetailFragment абонент Eventbus не запускается, и некоторые события, такие как notifyDataSetChanged, принадлежащие адаптеру моего списка, не отвечают и отражают изменения в пользовательском интерфейсе.

Отладка строк кода после возврата из ProductDetailFragment, когда управление достигает SearchFragment.onResume Eventbus все еще регистрируется и не требует регистрации снова, но сгенерированные события не вызывают подписчиков.

Если это поможет, вот события жизненного цикла, запущенные моим фрагментом:

События жизненного цикла при создании фрагмента:

onAttach
onCreate
onCreateView
onViewCreated
onViewCreated
onStart
onResume
onCreateOptionsMenu
onPrepareOptionsMenu

События жизненного цикла при выходе из этого фрагмента путем его замены:

onPause
onStop
onDestroyView
onDestroyOptionsMenu

События жизненного цикла при возврате к этому фрагменту:

onCreateView
onViewCreated
onViewCreated
onStart
onResume
onCreateOptionsMenu
onPrepareOptionsMenu

Ответы [ 2 ]

2 голосов
/ 13 марта 2019

Вы видите, что вы onStop() вызывается при замене фрагмента, поэтому EventBus незарегистрированный:

События жизненного цикла при выходе из этого фрагмента путем его замены:

onPause
onStop
onDestroyView
onDestroyOptionsMenu

И затем, когда вы возвращаетесь к фрагменту, вызывается ваш onResume(), затем регистрируется EventBus:

События жизненного цикла при возврате назад к этому фрагменту:

onCreateView
onViewCreated
onViewCreated
onStart
onResume
onCreateOptionsMenu
onPrepareOptionsMenu

Но когда вы возвращаетесь из ProductDetailFragment, ваш фрагмент onResume() еще не вызывается.Следовательно, метод подписки во фрагменте не вызывается.

1 голос
/ 17 марта 2019

Если вы перебираете свой код с помощью отладчика, из которого публикуется событие, в EventBus.post() до postSingleEvent() до postSingleEventForEventType(), какое значение он получает за subscriptions? Если переменная равна нулю или пуста, а метод возвращает значение false, значит, с подпиской что-то не так. Если это не так, или вы никогда не достигнете этого кода после публикации вашего мероприятия, проблема будет в другом месте вашего кода.

Я бы также рекомендовал регистрировать и отменять регистрацию подписок на события в соответствующих парах жизненных циклов, либо зарегистрироваться в onStart() и отменить регистрацию в onStop() или onResume() / onPause().

Было бы полезно, если бы вы поделились большим количеством своего кода, чтобы увидеть, где еще может быть проблема.

...