前言

  • 参考于大佬BiliBili longway777的视频:https://space.bilibili.com/13...

ViewModel

介绍

ViewModel是JetPack里面的一个内容,属于Architecture里面的内容

顾名思义,作用是把数据从视图里面独立出来单独管理,从而使控制器(Activity或者Fragment)变得更加简单

ViewModel的职责应该是用来管理界面的数据,而数据的获取也不应当放到ViewModel里面

除此之外还有一个特性,就是当Activity被摧毁的时候让数据不会丢失

比如对于我们的屏幕翻转之后,数据是不会丢失的,那么我们就不用使用onSaveInstanceState来进行手动存储了

那么ViewModel配合的组件还有一个叫做LiveData的东西,两者配合将会实现对数据的监听

ViewModel还可以配合Room(使用SQLite的中间件)来进行数据的存储

所以ViewModel是非常有用的


起步

创建一个新的项目,因为要是用Jetpack这个库,所以要勾选上

但是在android最新版,默认已经勾选上了这个库,所以不用担心

布局

新建一个类叫做MyViewModel,为了省力,就直接声明为public,继承ViewModel

import androidx.lifecycle.ViewModel;public class MyViewModel extends ViewModel {    public int number = 0;}

MainActivity

package com.bean;import androidx.appcompat.app.AppCompatActivity;import androidx.lifecycle.ViewModelProvider;import android.os.Bundle;import android.view.View;import android.widget.Button;import android.widget.TextView;public class MainActivity extends AppCompatActivity {    MyViewModel viewModel;    TextView viewModelText;    Button addOne,addTwo;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        viewModelText = findViewById(R.id.viewModel);        addOne = findViewById(R.id.addOne);        addTwo = findViewById(R.id.addTwo);        //工厂模式生成一个新的viewModel        ViewModelProvider.Factory factory = ViewModelProvider.AndroidViewModelFactory.getInstance(getApplication());        //第一个参数的意思是在什么范围内,这里传递的activity,就是在这个activity里面        ViewModelProvider viewModelProvider = new ViewModelProvider(this,factory);        viewModel = viewModelProvider.get(MyViewModel.class);        //我们的ViewModel会自动将数值存储,屏幕翻转之后会直接取得        viewModelText.setText(String.valueOf(viewModel.number));        addOne.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                viewModel.number++;                viewModelText.setText(viewModel.number+"");            }        });        addTwo.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                viewModel.number+=2;                viewModelText.setText(viewModel.number+"");            }        });    }}