Безопасно ли наблюдать LiveData внутри onActivityCreated или onViewCreated

Безопасно ли наблюдать LiveData внутри onActivityCreated или onViewCreated, разве это не добавляет нового наблюдателя в LifecycleOwner и несколько наблюдателей будут активны в одном Fragment? Например, когда мы переходим от Fragment A к Fragment B, а затем возвращаемся к Fragment A, onActivityCreated \ onViewCreated в Fragment A будет вызываться дважды, а viewModel.liveData.observe() будет вызываться дважды.

4
0
1 241
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это зависит от того, какой Lifecycle объект вы собираетесь передать своему Observer.

Допустим, вы подписались на метод Observer в Fragment'sonCreate. Это решает проблемы с двойным вызовом observe, но если пользователь нажмет кнопку «Назад», Fragment AonCreate не будет вызываться, поэтому Observer не будет подписан. Или даже в некоторых случаях ваш метод наблюдения может быть вызван, пока ваш фрагмент активен, что приводит к сбою.

public void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    viewModel.liveData.observe(this, Observer { myData -> {} });
}

Второй вариант, который у вас есть, это подписаться в onCreateView() или onViewCreated(). Проблема с этими двумя вариантами заключается в том, что он будет вызываться каждый раз при воссоздании Fragment A, и в конце вы получите более одного наблюдателя.

public void onViewCreated(View view, Bundle savedInstanceState){
    super.onViewCreated(view, savedInstanceState);
    viewModel.liveData.observe(this, Observer { myData -> {} });
}

Итак, как мы можем решить эти проблемы? Ответ прост: используйте viewLifecycleOwner.

public void onViewCreated(View view, Bundle savedInstanceState){
    super.onViewCreated(view, savedInstanceState);
    viewModel.liveData.observe(viewLifecycleOwner, Observer { myData -> {} });
}

Потому что таким образом вы наблюдаете за жизненным циклом вашего LiveData привязанного к Fragment представления.

Таким образом, безопасно наблюдать LiveData в onCreateView или onViewCreated и в onActivityCreated, поскольку в документации он вызывается после onCreateView: Ссылка (но устарело на уровне API 28 и больше не рекомендуется использовать).

P.S. Очень полезный доклад по этой проблеме в Google IO 2018: Ссылка на Youtube

Итак, observe с viewLifecycleOwner это безопасно, но что на самом деле происходит? новый наблюдатель не добавлен или где магия?

Pavel Poley 23.12.2020 18:42

Поскольку ваш наблюдатель привязан к жизненному циклу представления Fragment, после уничтожения представления наблюдатель также отписывается. Если вы воссоздаете фрагмент после этого, он снова добавит наблюдателя после вызова метода onCreateView.

hardartcore 23.12.2020 19:04

Другие вопросы по теме