JetpackViewModel

12次阅读

共计 1894 个字符,预计需要花费 5 分钟才能阅读完成。

前言

  • 参考于大佬 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+"");
            }
        });

    }
}

正文完
 0