返回
Fragment的正确保存状态的方式
Android
2023-11-18 19:09:17
setRetainInstance是Fragment中一个被弃用的方法,它用于在Activity重建时保存状态。但是,使用setRetainInstance会带来很多副作用,比如:
- 它会阻止Fragment被销毁,这可能导致内存泄漏。
- 它会使Fragment无法被正确地重建,因为它的状态已经被保存了。
- 它会使Fragment的代码变得更加复杂,因为需要处理状态保存和恢复的逻辑。
随着ViewModel的引入,开发者拥有了一个特定的API,用于保留与Activity,Fragments和Navigation相关联的状态。这使得开发者可以使用正确的方式来保存和恢复Fragment的状态,避免使用setRetainInstance所带来的问题。
ViewModel是一个轻量级的类,它不属于任何特定Activity或Fragment。这使得它可以在Activity和Fragment之间共享数据,并且在Activity或Fragment重建时不会丢失数据。
要使用ViewModel,只需在Fragment中声明一个ViewModel变量,然后使用它来保存和恢复数据。例如:
public class MyFragment extends Fragment {
private MyViewModel viewModel;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
viewModel = new ViewModelProvider(this).get(MyViewModel.class);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.my_fragment, container, false);
// 从ViewModel中获取数据并更新UI
TextView textView = view.findViewById(R.id.text_view);
textView.setText(viewModel.getData());
return view;
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
// 将数据保存到ViewModel中
viewModel.setData(textView.getText().toString());
}
}
ViewModel不仅可以用于保存和恢复Fragment的状态,还可以用于在Activity和Fragment之间共享数据。这使得代码更加简洁和易于维护。
因此,建议开发者使用ViewModel来保存和恢复Fragment的状态,而不是使用setRetainInstance。