为什么片段泄漏中的 Viewmodel 实例

why Viewmodel instance in fragment leaking

我正在使用视图模型和实时数据来观察 edittext 视图中的变化,如下所示。当我 运行 带有 leakcanar 的应用程序时,它向我显示了内存泄漏:Mainactivity.fragviewmodel 泄漏。

FragViewModel model;

@Override
public View onCreateView(@NotNull LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    model = new ViewModelProvider(requireActivity()).get(FragViewModel.class);

    final Observer<String> savedTextObserver = newName -> {
        list = MainActivity.quotesDatabaseClass.quoteDao().getQuotes();
        adapter.setData(list);
    };
    model.getTextToSave().observe(requireActivity(), savedTextObserver);
}

@Override
public void onDestroyView() {
    super.onDestroyView();

    fragmentEmojiBinding = null;
    model = null;


}

在 Fragment 的 onCreateView 中使用 .observe(requireActivity(), savedTextObserver); 从来都不是正确的事情:这就是说您想使用 Activity 的生命周期来观察,即使您删除分片或者把Fragment放在后面的栈上。

相反,您应该使用 .observe(getViewLifecycleOwner(), savedTextObserver); to get the Lifecycle specifically associated with the Fragment's view, which is the correct scope for any Observer that updates your Fragment's UI (such as yoursetAdapter`).