【问题标题】:why Viewmodel instance in fragment leaking为什么片段中的 Viewmodel 实例泄漏
【发布时间】:2021-03-02 03:20:53
【问题描述】:

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


}

【问题讨论】:

    标签: android memory-leaks viewmodel


    【解决方案1】:

    在 Fragment 的 onCreateView 中使用 .observe(requireActivity(), savedTextObserver); 从来都不是正确的事情:这就是说您想使用 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 yoursetAdapter`)。

    【讨论】:

    • 我还需要在 onDestroyView() 上执行 removeobserver() 吗?
    • 不,不是在使用getViewLifecycleOwner() 时 - 这就是重点,当视图被销毁时它会自动销毁。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多