为什么片段泄漏中的 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 your
setAdapter`).
我正在使用视图模型和实时数据来观察 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 your
setAdapter`).