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