Overview
今天在学习的过程中, 我学了一下 Android 的架构组件之 ViewModel 的学习操作. ViewModel 也是属于我们的 Android Jetpack 的一部风.
Android 开发者文档中是这么说的:
ViewModel 类旨在以注重生命周期的方式存储和管理界面相关的数据. ViewModel 类让数据可以在发生旋转等配置更改后继续存在的.
看一看我们是如何使用 ViewModel 的
架构组件为界面控制器提供了 ViewModel
辅助程序类, 该类负责为界面准备数据, 在配置更改期间会自动保留 ViewModel 对象, 以便他们存储的数据立即提供给下一个 Activity 或者是 Fragment 实例使用. 如果需要在应用中显示用户列表, 请确保获取和保留该用户列表的责任分配给 ViewModel, 而不是 Activity 或是 Fragment.
接着我们按照我们国际惯例, 来看一下实现代码:
- package com.example.viewmodellearn;
- import androidx.lifecycle.LiveData;
- import androidx.lifecycle.MutableLiveData;
- import androidx.lifecycle.ViewModel;
- import java.util.ArrayList;
- import java.util.List;
- 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() {
- List<User> usersList=new ArrayList<>();
- usersList.add(new User("Jia Hao","Male","18","China JiangSu"));
- users.setValue(usersList);
- }
- }
首先我们需要创建一个 class 命名为 MyViewModel 然后该类需要继承于我们的 ViewModel 这样我们就创建完成了.
在这里我希望 ViewModel 来帮助我处理 User 的信息, 因为作为一个软件来说 User 的信息还是比较重要的.
但是在这之前我们需要创建一个 User 的实体类. 这个随便就不放代码了.
完成这些之后我们就开始搭建我们的 ViewModel 了.
创建一个
MutableLiveData<List<User>>
的对象为 users, 这个 users 比较的重要, 我们后面会经常用到.
然后我们需要一个 getUsers 的方法, 这个方法可以帮助完成获取 Users 的操作. 这几个方法的返回值为 User
但是我们在获取的时候需要注意一个点, 就是如果没有存入用户数据我们直接获取那么就会出现空指针错误, 这个问题还是非常恶心的. 所以! 需要在获取前进行判断我们的 users 是否为空, 如果如果为空我们需要去初始化我们的 User 数据, 就是我们的 loadUsers 方法.
这样我们的 ViewModel 就 OK 了.
这个 ViewModel 完成之后我们看一下如何对我们的 Activity 或者是 Fragment 来操作了.
老规矩先看一下我们的代码:
- package com.example.viewmodellearn;
- import androidx.appcompat.App.AppCompatActivity;
- import androidx.lifecycle.Observer;
- import androidx.lifecycle.ViewModelProviders;
- import Android.os.Bundle;
- import Android.widget.TextView;
- import java.util.List;
- public class MainActivity extends AppCompatActivity {
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- MyViewModel model= ViewModelProviders.of(this).get(MyViewModel.class);
- model.getUsers().observe(this, new Observer<List<User>>() {
- @Override
- public void onChanged(List<User> users) {
- ((TextView)findViewById(R.id.main_Txt_UserName)).setText(users.get(0).getName());
- }
- });
- }
- }
这里的操作是我对界面中的一个 TextView 进行了赋值的操作.
将我们刚才完成的 ViewModel 实例化一下, 然后我们通过我们的 getUsers 方法来完成我们更新 UI 的操作.
如果重新创建了改 Activity, 那么他接受的 MyViewModel 实例和第一个 Activity 创建的实例相同, 当 Activity 完成时, 矿建会调用 ViewModel 的 onCleared() 方法, 来清理资源.
来源: http://www.bubuko.com/infodetail-3492771.html