返回

Fragment的正确保存状态的方式

Android

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。