MVVM -在一个片段,为什么我应该把Viewmodel观察者在onCreate?



我正在浏览本教程

https://learntodroid.com/consuming-a-rest-api-using-retrofit2-with-the-mvvm-pattern-in-android/

,用户将ViewModel Observer放在片段的onCreate中。我为什么要把它放在那里数据可能已经取好了,视图还没创建呢?

例如:

//In fragment's onCreate
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mContext = getContext();
mListUsersAdapter = new MembersAdapter(mContext, mListUsers);
mViewModel = new ViewModelProvider(this).get(MembersViewModel.class);
mViewModel.init();
mViewModel.getMembersData().observe(this, new Observer<ResponseBody>() {
@Override
public void onChanged(ResponseBody responseBody) {
mListUsersAdapter.notifyDataSetChanged();
}
});
}

getMembersData()可能会完成数据检索,.notifyDataSetChanged()会在onCreateView调用和回收器创建之前被调用。把观察者放在onCreateView甚至onViewCreated不是更有意义吗?

在大多数情况下,应用组件的onCreate()方法是正确的开始观察LiveData对象的位置

在教程链接中,他们有搜索功能。它没有数据,直到你点击搜索按钮,因此在onCreate中观察是可以的。根据你的逻辑,你可以在其他地方观察到。看看这个

用一种更一般的方式回答你的问题,你所描述的问题可能发生在你的LiveData在视图完全创建之前发出给观察者的情况下。

为了避免这种情况,我建议使用ViewLifecycleOwner并在生命周期事件中使用它,如onActivityCreated。你可以看看这篇中篇文章,了解更多。

LiveData只有当数据发生变化时才发送更新,并且只发送给活动观察者。

他可能在oncreate()中有观察数据以确保片段具有数据,它可以显示一旦它变得活跃。只要一个应用组件在STARTED状态时,它从它正在观察的LiveData对象接收最新的值。只有当要观察的LiveData对象已经设置时,才会发生这种情况。

相关内容