Android开发Android技术知识Android开发

Android Architecture Components—

2019-02-21  本文已影响3人  大虾啊啊啊

一、前言

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中的数据也就依然存在。

上一篇下一篇

猜你喜欢

热点阅读