一、前言
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上显示为:我不是大虾。
当我们对手机进行横竖屏切换的时候,数据依然没有变化。
三、小结
对LiveData+ViewModel的小结可以概括为:
(1)LiveData可以把数据封装成可观察性,当我们观察到数据的变化,我们可以做相应的操作
(2)ViewModel使得数据持久化,当组件被销毁重建的时候,ViewModel依然没有销毁,那么ViewModel中的数据也就依然存在。