安卓旋转屏幕后如何防止数据丢失-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 中添加:

java 复制代码
dependencies {
    implementation "androidx.lifecycle:lifecycle-viewmodel:2.8.0"
}

3. 定义一个 ViewModel

我们先写一个最简单的 CounterViewModel,用来保存一个计数值。

java 复制代码
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

java 复制代码
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;

    @Override
    protected 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()));

        // 点击按钮时 +1
        btnAdd.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                counterViewModel.increaseCounter();
                tvCounter.setText(String.valueOf(counterViewModel.getCounter()));
            }
        });
    }
}

在这里,关键代码是:

java 复制代码
counterViewModel = new ViewModelProvider(this).get(CounterViewModel.class);
  • this 表示当前 Activity。
  • 这样拿到的 counterViewModel 即使在屏幕旋转后也能保持数据不变。

使用了VIew Model后,当初始打开界面,点击按钮几次,计数会增加。如果此时旋转屏幕,计数值不会归零,而是保留在原来的数值上。这就是 ViewModel 的基本用法。


6. 总结

ViewModel 的核心作用 是保存与 UI 相关的数据,在配置更改时依然存在。更核心的是它完美契合了 MVVM 架构的设计思想 ------实现视图(View)与数据(Model)的解耦,并承担了数据处理和状态管理的关键职责。本文仅基础入门ViewModel,会在下篇文章中详细介绍利用JetPack组件实现一个MVVM架构。

相关推荐
HLC++10 小时前
Linux的进程间通信
android·linux·服务器
爱笑鱼14 小时前
Binder(二):AIDL 生成的 Proxy、Stub 和 Parcel 到底在做什么?
android
爱笑鱼14 小时前
Binder(一):一次方法调用,究竟怎样跨进程执行?
android
壮哥_icon15 小时前
【Android 系统开发】使用 BAT 脚本高效自动化管理 /system/priv-app/ 系统应用(安装与卸载)
android·运维·自动化
用户693717500138417 小时前
Claude Code终端日志Token占用实测:一个过滤器砍掉60%-90%
android·前端·后端
蝉蜕日记17 小时前
AccumuPDF高级版 v2.57 | 视图文转换PDF,合并分割压缩
android·智能手机·pdf·生活·软件需求
吐了啊取名字太难17 小时前
美颜系统AI修图本地跑并支持Mac、win、安卓、iOS不卡顿
android·人工智能·windows·数码相机·mac·ai编程
阿pin18 小时前
Android随笔-Retrofit
android·retrofit
想取一个与众不同的名字好难18 小时前
安卓自定义颜色选择器
android
我命由我1234519 小时前
Android 开发问题:java.lang.NoSuchMethodError:No virtual method readAllBytes()
android·java·java-ee·kotlin·android studio·android-studio·android runtime