Android Architecture Components—

作者: 大虾啊啊啊 | 来源:发表于2019-02-21 22:50 被阅读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中的数据也就依然存在。

    相关文章

      网友评论

        本文标题:Android Architecture Components—

        本文链接:https://www.haomeiwen.com/subject/cgdjyqtx.html