安卓旋转屏幕后如何防止数据丢失-ViewModel入门
Android ViewModel 入门教程
在日常开发中,当 Activity 因为旋转屏幕或内存回收被销毁重建时,UI 中的数据也会丢失。 这时候,Android Jetpack 提供的 ViewModel 就能帮我们解决这个问题。
1. 什么是 ViewModel
ViewModel 是一种架构组件。它专门用于存储和管理与 UI 相关的数据,并且能够在 配置更改(如屏幕旋转) 时依然保持数据不丢失。与 Activity / Fragment 的生命周期绑定,但不会因为它们的重建而销毁。
假设一个页面需要加载网络数据,若在 Activity 中直接处理,那么屏幕旋转时,Activity 进行重建,网络请求可能被重复发起,数据需要重新加载,用户体验差
使用 ViewModel 后,数据存储在 ViewModel 中,旋转后新 Activity 可直接从 ViewModel 获取已有数据。避免重复请求,提升性能和体验
简单来说:ViewModel 可以帮助你把数据和界面逻辑分开,并且保证数据不会因为界面重建而丢失。
2. 添加依赖
在 app/build.gradle
中添加:
dependencies {implementation "androidx.lifecycle:lifecycle-viewmodel:2.8.0"
}
3. 定义一个 ViewModel
我们先写一个最简单的 CounterViewModel
,用来保存一个计数值。
import androidx.lifecycle.ViewModel;public class CounterViewModel extends ViewModel {private int counter = 0;public int getCounter() {return counter;}public void increaseCounter() {counter++;}
}
这里的 counter
就是我们要保存的数据。即使 Activity 因为旋转而重建,这个值也会被保留。
4. 在 Activity 中使用 ViewModel
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 {private CounterViewModel counterViewModel;private TextView tvCounter;private Button btnAdd;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);tvCounter = findViewById(R.id.tv_counter);btnAdd = findViewById(R.id.btn_add);// 获取 ViewModel 实例counterViewModel = new ViewModelProvider(this).get(CounterViewModel.class);// 显示当前计数tvCounter.setText(String.valueOf(counterViewModel.getCounter()));// 点击按钮时 +1btnAdd.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {counterViewModel.increaseCounter();tvCounter.setText(String.valueOf(counterViewModel.getCounter()));}});}
}
在这里,关键代码是:
counterViewModel = new ViewModelProvider(this).get(CounterViewModel.class);
this
表示当前 Activity。- 这样拿到的
counterViewModel
即使在屏幕旋转后也能保持数据不变。
使用了VIew Model后,当初始打开界面,点击按钮几次,计数会增加。如果此时旋转屏幕,计数值不会归零,而是保留在原来的数值上。这就是 ViewModel 的基本用法。
6. 总结
ViewModel 的核心作用是保存与 UI 相关的数据,在配置更改时依然存在。更核心的是它完美契合了 MVVM 架构的设计思想 ——实现视图(View)与数据(Model)的解耦,并承担了数据处理和状态管理的关键职责。本文仅基础入门ViewModel,会在下篇文章中详细介绍利用JetPack组件实现一个MVVM架构。