一、前言
LiveData和ViewModel我们需要一起介绍,因为在实际的开发过程中,LiveData和ViewModel基本是配合起来使用的。
(1)LiveData:是一种持有可被观察数据的类。也就是说我们可以把数据设置到LiveData中,那么我们的数据就有可观察性,根据观察到数据的变化,我们可以在UI做相应的操作。
(2)ViewModel:ViewModel的意义在于,当我们在Activity中初始化ViewModel的时候,就算Activity被销毁 了,ViewModel依然存在,在Activity重建的时候,我们仍然可以获取之前创建的ViewModel对象,当然就可以获取到ViewModel对象中的数据了。所以才说LiveData和ViewModel往往需要结合使用。
设想一下当用户正在输入一些数据,突然某些原因导致Activity重建,那这样用户输入的信息又全没了,又要重新输入。会不会使得用户不耐烦,当然我们马上会想到onSaveInstanceState,但是onSaveInstanceState只是适合可以序列化的少量数据,如果是大量的数据就不行了。而ViewModel就能处理大量的数据。
后面我们会对LiveData和ViewModel的源码进行分析,下面我们先介绍LiveData和ViewModel的简单使用。
二 、LiveData和ViewModel的使用
首先我们创建UserViewModel类并实现ViewModel接口。创建userDtoLiveData成员变量,也就是我们需要观察的数据。userDtoLiveData的数据的变化我们将会显示在UI上。
package com.jilian.androidarchitecture;import android.arch.lifecycle.LiveData;import android.arch.lifecycle.MutableLiveData;import android.arch.lifecycle.ViewModel;import com.jilian.androidarchitecture.common.UserDto;public class UserViewModel extends ViewModel { private MutableLiveData<UserDto> userDtoLiveData; public LiveData<UserDto> getUserDtoLiveData() { return userDtoLiveData; } private UserDto getUser(String name) { UserDto userDto = new UserDto(); userDto.setUsername(name); return userDto; } /** * 初始化数据 */ public void initData(){ userDtoLiveData = new MutableLiveData<UserDto>(); userDtoLiveData.setValue(getUser("我是大虾")); } /** * 数据改变 */ public void changeUser(){ userDtoLiveData.setValue(getUser("我不是大虾")); } }
创建ViewModelActivity类,并创建 UserViewModel对象。
package com.jilian.androidarchitecture;import android.arch.lifecycle.Observer;import android.arch.lifecycle.ViewModelProviders;import android.os.Bundle;import android.support.annotation.Nullable;import android.support.v7.app.AppCompatActivity;import android.view.View;import android.widget.TextView;import com.jilian.androidarchitecture.common.UserDto;public class ViewModelActivity extends AppCompatActivity { private UserViewModel viewModel; private TextView tvName; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_viewmodel); tvName = (TextView) findViewById(R.id.tv_name); viewModel = ViewModelProviders.of(this).get(UserViewModel.class); //第一次初始化数据 viewModel.initData(); viewModel.getUserDtoLiveData().observe(this, new Observer<UserDto>() { @Override public void onChanged(@Nullable UserDto userDto) { //显示在UI 上 tvName.setText(userDto.getUsername()); } }); tvName.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { viewModel.changeUser(); } }); } }
我们首先调用viewModel中的initData()方法,给userDtoLiveData初始化值为:我是大虾
//第一次初始化数据 viewModel.initData();
然后监听数据的变化,并显示到UI上
viewModel.getUserDtoLiveData().observe(this, new Observer<UserDto>() { @Override public void onChanged(@Nullable UserDto userDto) { //显示在UI 上 tvName.setText(userDto.getUsername()); } });
我们发现开始的时候 UI上显示:我是大虾,
然后点击UI调用ViewModel中的changeUser()方法,即把userDtoLiveData中的数据改为:我不是大虾。
tvName.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { viewModel.changeUser(); } });
这个时候我们发现 UI上显示为:我不是大虾。
当我们对手机进行横竖屏切换的时候,数据依然没有变化。
作者:大熊啊啊啊
链接:https://www.jianshu.com/p/79a89fa7a80e