В этом случае фрагмент раздувается из тега <fragment>
в макете действия, поэтому жизненный цикл фрагмента и действия всегда одинаков, поэтому он не имеет никакого значения.
Однако, есть два случая, когда это терпит неудачу:
- Если вы
remove()
или replace()
Фрагмента, использование getActivity()
для вашего LifecycleOwner
приведет к утечке Фрагмента, поскольку LiveData содержит сильную ссылку на Наблюдателя (и, следовательно, на Фрагмент, поскольку он является нестатический внутренний класс), пока действие не будет уничтожено
- Если вы
detach()
, а затем attach()
Фрагмент (например, с FragmentPagerAdapter
), то использование жизненного цикла Фрагмента в onCreateView()
приведет к нескольким Наблюдателям, поскольку onCreateView()
вызывается каждый раз при просмотре фрагмента воссоздается после присоединения, и предыдущие Наблюдатели не уничтожаются, поскольку жизненный цикл Фрагмента не был уничтожен.
Правильное LifecycleOwner
для использования в onCreateView()
: всегда getViewLifecycleOwner()
, поскольку этот жизненный цикл разрушается при разрушении представления фрагмента:
mSeekBarViewModel.seekbarValue.observe(getViewLifecycleOwner(), new Observer<Integer>() {
@Override
public void onChanged(@Nullable Integer value) {
if (value != null) {
mSeekBar.setProgress(value);
}
}
});
Это предотвращает утечку фрагмента с помощью потенциально более продолжительного срока службы LifecycleOwner
(например, активность) и предотвращает регистрацию нескольких наблюдателей при использовании шаблонов, подобных тем, которые используются в FragmentPagerAdapter
.