Loading...

文章背景图

[学习,记录] ViewModelProvider

2021-03-18
845
-
- 分钟

序言

在正常情况下,旋转屏幕或切换系统语言,都会导致Activity被销毁,这样页面上原本的数据就会丢失。
ViewModelProvider可以用来保存页面上的数据,但存在一些小问题(我的小问题)。

环境

IDEA2020.3.3 社区版
java version "1.8.0_271"
Android SDK 7.0 (API24)
项目模板 Empty Activity

代码

MyViewModel

package com.example.viewmodel;

import androidx.lifecycle.ViewModel;

public class MyViewModel extends ViewModel {

  public int number = 0;

}

MainActivity

package com.example.viewmodel;

import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import androidx.lifecycle.ViewModelProvider;

public class MainActivity extends AppCompatActivity {

  private MyViewModel myViewModel;
  private TextView textView;
  private Button button1, button2;

  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    myViewModel = new ViewModelProvider.AndroidViewModelFactory(getApplication()).create(MyViewModel.class);

    textView = findViewById(R.id.textView);
    textView.setText(String.valueOf(myViewModel.number));

    button1 = findViewById(R.id.button);
    button2 = findViewById(R.id.button2);

    button1.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {
        myViewModel.number++;
        textView.setText(String.valueOf(myViewModel.number));
      }
    });
    button2.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {
        myViewModel.number += 2;
        textView.setText(String.valueOf(myViewModel.number));
      }
    });
  }

}

界面展示

Screenshot_1616059763.png

在使用IDEA创建项目时,并没有androidx的选项,而看的教学视频是有的,想着可能是新版会自动引入就finish了,在编写代码时发现确实有ViewModelProvider这个类。

尝试过使用以下两种方式创建MyViewModel的实例

myViewModel = new ViewModelProvider.NewInstanceFactory().create(MyViewModel.class);
// 或
myViewModel = new ViewModelProvider.AndroidViewModelFactory(getApplication()).create(MyViewModel.class);

虽然能正常创建,但都无法让ViewModelProvider保存数据。

根据视频导入了Android Lifecycle ViewModel
build.gradle(app下的)

// ...
dependencies {
    // ...
    implementation 'androidx.lifecycle:lifecycle-viewmodel:2.3.0'
}

再使用上面的两种方式,依旧无法保存数据。

于是开始尝试使用弹幕中提到的写法来创建MyViewModel的实例。尝试过使用以下三种写法,都可以保存数据。

myViewModel = new ViewModelProvider(this).get(MyViewModel.class);
// 或
myViewModel = new ViewModelProvider(this, new ViewModelProvider.NewInstanceFactory()).get(MyViewModel.class);
// 或
myViewModel = new ViewModelProvider(this, new ViewModelProvider.AndroidViewModelFactory(getApplication())).get(MyViewModel.class);

虽然视频中有讲到按下返回键也能保存,但却未进行演示,个人实验是无法保存的。
视频链接: https://www.bilibili.com/video/BV1w4411t7UQ

评论交流

文章目录