ViewModel 的介绍与用法
ViewModel 是负责为{@link android.app.Activity Activity}或{@link androidx.fragment.app.Fragment Fragment}准备和管理数据的类。它还处理 Activity / Fragment 与应用程序其余部分的通信(例如,调用业务逻辑类)。
一个 ViewModel 总是与一个范围(一个 Fragment 或者一个 Activity )相关联而创建的,只要作用域是活的,就会被保留。例如,如果它是一个 Activity ,直到它finish。
换句话说,这意味着如果 ViewModel 的所有者因配置更改(例如旋转)而被销毁,则不会销毁它。所有者的新实例将重新连接到现有的 ViewModel 。
ViewModel 的目的是获取并保留 Activity 或 Fragment 所需的信息。 Activity 或 Fragment 应能够观察 ViewModel 中的更改。 ViewModel 通常通过{@link LiveData}或 Android 数据绑定公开此信息。您也可以使用自己喜欢的框架中的任何可观察性构造。
ViewModel的唯一责任是管理UI的数据。它绝不应该访问您的视图层次结构或保留对 Activity 或 Fragment 的引用。
从 Activity 的角度来看,典型的用法是:
public class UserActivity extends Activity {
{@literal @}Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.user_activity_layout);
final UserModel viewModel = new ViewModelProvider(this).get(UserModel.class);
viewModel.getUser().observe(this, new Observer<User>() {
{@literal @}Override
public void onChanged(@Nullable User data) {
// 更新UI.
}
});
findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
{@literal @}Override
public void onClick(View v) {
viewModel.doAction();
}
});
}
}
ViewModel 将是:
public class UserModel extends ViewModel {
private final MutableLiveData<User> userLiveData = new MutableLiveData<>();
public LiveData<User> getUser() {
return userLiveData;
}
public UserModel() {
// 触发用户加载。
}
void doAction() {
// 根据操作,执行必要的业务逻辑调用并更新userLiveData。
}
}
ViewModel 也可以用作 Activity 的不同 Fragment 之间的通信层。每个 Fragment 都可以通过其 Activity 使用相同的 key 来获取 ViewModel 。这允许 Fragment 之间以解耦方式进行通信,从而使它们不再需要直接与另一个 Fragment 通信。
public class MyFragment extends Fragment {
public void onStart() {
UserModel userModel = new ViewModelProvider(requireActivity()).get(UserModel.class);
}
}
以上来自 ViewModel.class ,我只做了翻译,详情请同学们查看官方文档~