为了账号安全,请及时绑定邮箱和手机立即绑定

Android Architecture Components

标签:
Android

一、前言

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


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消