ViewModel 简介 ViewModel
类是一种业务逻辑或屏幕级状态容器。它用于将状态公开给界面,以及封装相关的业务逻辑。它的主要优点是,它可以缓存状态,并可在配置更改后持久保留相应状态。这意味着在 activity 之间导航时或进行配置更改后(例如旋转屏幕时),界面将无需重新提取数据。
ViewModel 的生命周期 ViewModel
的生命周期与其作用域直接关联。ViewModel
会一直保留在内存中,直到其作用域 ViewModelStoreOwner
消失。以下上下文中可能会发生这种情况:
对于 activity,是在 activity 完成时。
对于 fragment,是在 fragment 分离时。
对于 Navigation 条目,是在 Navigation 条目从返回堆栈中移除时。
实现 ViewModel 下面是一个让用户可以在屏幕上掷骰子的 ViewModel 实现示例:
public class DiceUiState { private final Integer firstDieValue; private final Integer secondDieValue; private final int numberOfRolls; } public class DiceRollViewModel extends ViewModel { private final MutableLiveData<DiceUiState> uiState = new MutableLiveData (new DiceUiState (null , null , 0 )); public LiveData<DiceUiState> getUiState () { return uiState; } public void rollDice () { Random random = new Random (); uiState.setValue( new DiceUiState ( random.nextInt(7 ) + 1 , random.nextInt(7 ) + 1 , uiState.getValue().getNumberOfRolls() + 1 ) ); } } public class MyActivity extends AppCompatActivity { public void onCreate (Bundle savedInstanceState) { super .onCreate(savedInstanceState); DiceRollViewModel model = new ViewModelProvider (this ).get(DiceRollViewModel.class); model.getUiState().observe(this , uiState -> { }); } }
ViewModel 通常不应引用视图、Lifecycle 或可能存储对 activity 上下文的引用的任何类。由于 ViewModel 的生命周期大于界面的生命周期,因此在 ViewModel 中保留与生命周期相关的 API 可能会导致内存泄漏。
参考 ViewModel overview