声明依赖项
dependencies {def lifecycle_version = "2.2.0"// ViewModelimplementation "androidx.lifecycle:lifecycle-viewmodel:$lifecycle_version"// LiveDataimplementation "androidx.lifecycle:lifecycle-livedata:$lifecycle_version"}实现 ViewModel
架构组件为界面控制器提供了 ViewModel 辅助程序类,该类负责为界面准备数据 。在配置更改期间会自动保留 ViewModel 对象,以便它们存储的数据立即可供下一个 Activity 或 Fragment 实例使用 。例如,如果您需要在应用中显示用户列表,请确保将获取和保留该用户列表的责任分配给 ViewModel,而不是 Activity 或 Fragment,如以下示例代码所示:
public class MyViewModel extends ViewModel {private MutableLiveData<List<User>> users;public LiveData<List<User>> getUsers() {if (users == null) {users = new MutableLiveData<List<User>>();loadUsers();}return users;}private void loadUsers() {// Do an asynchronous operation to fetch users.}}然后,您可以从 Activity 访问该列表,如下所示:
public class MyActivity extends AppCompatActivity {public void onCreate(Bundle savedInstanceState) {// Create a ViewModel the first time the system calls an activity's onCreate() method.// Re-created activities receive the same MyViewModel instance created by the first activity.MyViewModel model = new ViewModelProvider(this).get(MyViewModel.class);model.getUsers().observe(this, users -> {// update UI});}}ViewModel在 Fragment 之间共享数据
使用 ViewModel 对象解决这一常见的难点 。这两个 Fragment 可以使用其 Activity 范围共享 ViewModel 来处理此类通信
public class SharedViewModel extends ViewModel {private final MutableLiveData<Item> selected = new MutableLiveData<Item>();public void select(Item item) {selected.setValue(item);}public LiveData<Item> getSelected() {return selected;}}//获取 ViewModelProvider 时,会收到相同的 SharedViewModel 实例(其范围限定为该 Activity)public class MasterFragment extends Fragment {private SharedViewModel model;public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {super.onViewCreated(view, savedInstanceState);//通过requireActivity() Fragment 会检索包含它们的 Activitymodel = new ViewModelProvider(requireActivity()).get(SharedViewModel.class);itemSelector.setOnClickListener(item -> {model.select(item);});}}//获取 ViewModelProvider 时,会收到相同的 SharedViewModel 实例(其范围限定为该 Activity)public class DetailFragment extends Fragment {public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {super.onViewCreated(view, savedInstanceState);//通过requireActivity() Fragment 会检索包含它们的 ActivitySharedViewModel model = new ViewModelProvider(requireActivity()).get(SharedViewModel.class);model.getSelected().observe(getViewLifecycleOwner(), { item ->// Update the UI.});}}该方法的优势:
- Activity 不需要执行任何操作,也不需要对此通信有任何了解 。
- 除了 SharedViewModel 约定之外,Fragment 不需要相互了解 。如果其中一个 Fragment 消失,另一个 Fragment 将继续照常工作 。
- 每个 Fragment 都有自己的生命周期,而不受另一个 Fragment 的生命周期的影响 。如果一个 Fragment 替换另一个 Fragment,界面将继续工作而没有任何问题 。
官网使用参考
1、创建 LiveData 对象
LiveData 是一种可用于任何数据的封装容器,其中包括可实现 Collections 的对象,如 List 。LiveData 对象通常存储在 ViewModel 对象中,并可通过 getter 方法进行访问,如以下示例中所示:
public class NameViewModel extends ViewModel {// Create a LiveData with a Stringprivate MutableLiveData<String> currentName;public MutableLiveData<String> getCurrentName() {if (currentName == null) {currentName = new MutableLiveData<String>();}return currentName;}// Rest of the ViewModel...}最初,LiveData 对象中的数据并未经过设置 。注意:请确保用于更新界面的 LiveData 对象存储在 ViewModel 对象中,而不是将其存储在 Activity 或 Fragment 中,原因如下:1、避免 Activity 和 Fragment 过于庞大 。现在,这些界面控制器负责显示数据,但不负责存储数据状态 。2、将 LiveData 实例与特定的 Activity 或 Fragment 实例分离开,并使 LiveData 对象在配置更改后继续存在 。2、观察 LiveData 对象在大多数情况下,在应用组件的 onCreate() 方法是开始观察 LiveData 对象原因如下:
1、确保系统不会从 Activity 或 Fragment 的 onResume() 方法进行冗余调用 。
2、确保 Activity 或 Fragment 变为活跃状态后具有可以立即显示的数据 。一旦应用组件处于 STARTED 状态,就会从它正在观察的 LiveData 对象接收最新值 。只有在设置了要观察的 LiveData 对象时,才会发生这种情况 。
推荐阅读
- 你的平台有这四大技术架构群吗?
- SMP、MPP和Hadoop数据库架构方案
- 搞懂Android应用启动过程,再也不怕面试官了
- 软件架构设计分层模型和构图思考
- 细数软件架构中的解耦
- Netflix如何实现Android与 iOS共用一套代码?
- Linux主流架构运维工作简单剖析
- 一文看懂微服务架构之注册中心Consul、Nacos
- 程序员也需了解的主流云计算网络架构
- 数据中台到底包括什么内容?一文详解架构设计与组成
