Безопасно ли наблюдать LiveData внутри onActivityCreated или onViewCreated, разве это не добавляет нового наблюдателя в LifecycleOwner и несколько наблюдателей будут активны в одном Fragment?
Например, когда мы переходим от Fragment A к Fragment B, а затем возвращаемся к Fragment A, onActivityCreated \ onViewCreated в Fragment A будет вызываться дважды, а viewModel.liveData.observe() будет вызываться дважды.
Это зависит от того, какой 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
Поскольку ваш наблюдатель привязан к жизненному циклу представления Fragment, после уничтожения представления наблюдатель также отписывается. Если вы воссоздаете фрагмент после этого, он снова добавит наблюдателя после вызова метода onCreateView.
Итак,
observeсviewLifecycleOwnerэто безопасно, но что на самом деле происходит? новый наблюдатель не добавлен или где магия?