前言

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+"");
            }
        });

    }
}


嚎羸
1 声望1 粉丝

一只Java菜鸡