为什么 Fragment 中的 Viewmodel 实例会泄漏

sum*_*man 2 android memory-leaks viewmodel

我正在使用视图模型和实时数据来观察编辑文本视图中的变化,如下所示。当我使用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;


}
Run Code Online (Sandbox Code Playgroud)

ian*_*ake 6

.observe(requireActivity(), savedTextObserver);在 Fragment 中使用onCreateView永远不是正确的事情:这就是说您想要观察使用 Activity 的生命周期,即使您删除 Fragment 或将 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 your设置适配器`)。