Каковы причины для передачи getActivity как LifecycleOwner методу наблюдения LiveData во фрагменте? - PullRequest
0 голосов
/ 03 ноября 2018

Этот пример Google вызывает observe на LiveData в fragment и передает getActivity() как LifecycleOwner.

mSeekBarViewModel.seekbarValue.observe(getActivity(), new Observer<Integer>() {
        @Override
        public void onChanged(@Nullable Integer value) {
            if (value != null) {
                mSeekBar.setProgress(value);
            }
        }
    });

https://github.com/googlecodelabs/android-lifecycles/blob/master/app/src/main/java/com/example/android/lifecycles/step5_solution/Fragment_step5.java

Я не могу обернуться вокруг каких-либо причин для этого. Я хочу получать обновления только до тех пор, пока fragment активен, так почему бы не добавить его в fragment? Есть ли причины когда-либо НЕ использовать его в fragment?

1 Ответ

0 голосов
/ 03 ноября 2018

В этом случае фрагмент раздувается из тега <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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...