MVVM - 在片段中,为什么我应该将 Viewmodel 观察器放在 onCreate 中?

MVVM - In a fragment, why should I place the Viewmodel observer inside 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() 可能会完成检索数据,并且会在调用 onCreateView 和创建回收器之前调用 .notifyDataSetChanged()。将观察者放在 onCreateView 甚至 onViewCreated 中不是更有意义吗?

LiveData 仅在数据发生变化时传递更新,并且仅传递给活跃的观察者。

他可能在 oncreate() 中观察了数据,以确保片段具有一旦激活就可以显示的数据。一旦应用程序组件处于 STARTED 状态,它就会从它正在观察的 LiveData 对象中接收最新值。仅当已设置要观察的 LiveData 对象时才会出现这种情况。

In most cases, an app component’s onCreate() method is the right place to begin observing a LiveData object

在教程中 link 他们有搜索功能。在您单击搜索按钮之前它没有数据,因此可以在 onCreate 中观察。根据您的逻辑,您可以在其他地方观察。 Check this out

为了更笼统地回答您的问题,如果您的 LiveData 在完全创建视图之前向观察者发出信号,则可能会发生您描述的问题。

为了避免这种情况,我建议使用 ViewLifecycleOwner 并在 onActivityCreated 等生命周期事件中使用它。 有这个 medium post 您可以查看以了解更多信息。