安卓旋轉屏幕后如何防止數據丟失-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架構。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/97892.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/97892.shtml
英文地址,請注明出處:http://en.pswp.cn/web/97892.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Linux 下的 Vim 使用與網絡安全配置詳解

目錄 引言 一、Vim 編輯器的使用 1. Vim 的模式 2. 常用操作命令 3. 保存與退出 4. 多窗口與 Shell 切換 二、Linux 網絡基礎 1. 網絡分類 2. IP 地址與分類 三、網絡配置與工具 1. ifconfig 2. netstat 3. wget 4. 主機名與 IP 映射 四、Linux 防火墻與安全設置…

Docker 容器傳輸文件的常用方法

Docker 容器傳輸文件的常用方法 在 Docker 日常使用中,經常需要在主機與容器之間傳輸文件(如配置文件、代碼包、日志等)。以下是四種最常用的實現方式,覆蓋臨時傳輸、持久共享、構建集成等不同場景。 1. 使用 docker cp 命令&…

視頻轉音頻在線工具大比拼,哪家體驗更勝一籌?

最近工作上遇到了個挺有意思的需求,需要從幾個教學視頻里提取出音頻內容,方便做成播客形式,讓學員能隨時隨地學習。一開始,我以為這活兒挺簡單的,不就是把視頻里的聲音單獨弄出來嘛,結果一上手才發現&#…

KafKa02:Kafka配置文件server.properties介紹

一、配置文件位置二、配置文件介紹默認下:9092 是處理消息隊列核心業務(客戶端與 broker 交互)的端口9093 是集群內部控制器通信的端口# 指定節點角色,這里同時作為 broker(消息代理)和 controller&#xf…

哈爾濱云前沿服務器租用托管

黑龍江前沿數據,始建于2005年,多年的歷史,專業從事域名注冊,虛擬主機,服務器租用,云主機,網站建設等互聯網服務。電信/聯通/雙線/機房/眾多機房供您選擇,總有一個適合您的服務器&…

Qt開發經驗 --- Qt 修改控件樣式的方式(16)

文章目錄[toc]1 概述2 Qt Style Sheets (QSS)3 使用 QStyle 和 QProxyStyle4 設置 Palette (調色板)5 使用預定義的 QStyle6 直接設置控件屬性7 自定義控件繪制更多精彩內容👉內容導航 👈👉Qt開發經驗 👈1 概述 Qt 提供了多種修改…

Vue3》》Svg圖標 封裝和使用

SVG 安裝插件 npm i vite-plugin-svg-icons // vite.config.ts import { defineConfig } from vite import vue from vitejs/plugin-vue import { createSvgIconsPlugin } from vite-plugin-svg-icons import { resolve } from path export default defineConfig({//配置路徑別…

【04】AI輔助編程完整的安卓二次商業實戰-尋找修改替換新UI首頁圖標-菜單圖標-消息列表圖標-優雅草伊凡

【04】AI輔助編程完整的安卓二次商業實戰-尋找修改替換新UI首頁圖標-菜單圖標-消息列表圖標-優雅草伊凡引言本次二開布局沒有變,但是下一次整體布局會有變,不過本次開發發現朋友圈跳轉功能的流程步驟也做了一定的變化。原生項目復雜就復雜于就算一個顏色…

龍蜥8.10中spark各種集群及單機模式的搭建spark3.5.6(基于hadoop3.3.6集群)

先說最終的訪問端口,如我這里ip為172.20.94.37、172.20.94.38、172.20.94.39,主機名分別為:hadoop37、hadoop38、hadoop39. 最終訪問(默認端口): hadoop webui 172.20.94.37:9870 hdfs 端口 8020 yarn 172.…

關于我重新學習 react 的第一遍

今天是25年9月11號,很久很久沒有學習前端知識了,坦誠來說還清楚記得在大學里因為前端技術第一次獲獎的心情,也清晰記得寫完第一篇博客后的心情,工作和運動給我最大程度的成就感。 打破自己 重新開始 完全地 版本一 25.9.11 文章目…

第2課:Agent系統架構與設計模式

第2課:Agent系統架構與設計模式 課程目標 理解Agent的基本概念和特性掌握多Agent系統的設計模式學習Agent通信協議和消息傳遞實踐創建簡單的Agent框架 課程內容 2.1 Agent基礎概念 什么是Agent? Agent是一個具有自主性、反應性、社會性和主動性的計…

Day42 51單片機中斷系統與8×8 LED點陣掃描顯示

day42 51單片機中斷系統與88 LED點陣掃描顯示一、51單片機引腳位操作 —— sbit 關鍵字 作用 sbit 是專用于 51 單片機架構的 C 語言擴展關鍵字,用于定義特殊功能寄存器(SFR)中的某一位,從而實現對單個 I/O 引腳的直接位操作。 示…

差分: 模板+題目

題目:【模板】差分 應用場景:快速解決將某一個區間所有元素加上 “一個數” 的操作。 第一步,預處理差分數組。 f[i] 表示:當前元素與前一個元素的差值 a[i] - a[i-1]; 但在題目中,我們其實可以不用到a[]這個數組…

GD32 Timer+ADC多通道+DMA+PWM調試記錄

本例記錄使用GD32307C開發板,實現以內部Timer1 CH1為觸發源,觸發ADC0的兩個通道,進行并行非連續采樣,病通過DMA傳輸采樣結果。同時輸出PWM,用來檢測Timer1 CH1的觸發周期。下面介紹具體實現過程:1. gpio初始…

阻塞 IO為什么叫BIO,非阻塞IO為什么叫NIO,異步IO為什么叫AIO

IOIO的核心就是數據傳輸,也就是程序與外部設備之間進行傳輸,通過IO的核心可以分為,文件IO和網絡IO文件IO交互的對象就是本地存儲設備,比方說讀寫本地文件。網絡IO交互的對象就是網絡設備,核心的應用場景就是網絡通信。…

10分鐘了解什么是多模態大模型

10分鐘了解什么是多模態大模型(MM-LLMs) 1. 什么是多模態 Multimodality 多模態(Multimodality)是指集成和處理兩種或兩種以上不同類型的信息或數據的方法和技術。在機器學習和人工智能領域,多模態涉及的數據類型通常…

通過DSL生成Jenkins流水線

代碼化管理 Jenkins 流水線(Infrastructure as Code) 版本控制:DSL 腳本可以像代碼一樣存入 Git、GitLab 等版本控制系統,所有任務配置的變更都有提交記錄,便于追溯歷史、回滾錯誤。協作效率:團隊成員可以通…

信號量主要API及綜合應用

1.信號量概述信號量是一個底層核心模塊【int】類型變量,記錄當前信號量數據。信號量 P 操作 (sem_wait)線程檢測對應信號量底層 int 數據數值,如果大于 0,當前線程獲得 CPU 執行權,同時將信號量底層 int 數據-1 操作。如果底層數據…

工業自動化領域的“超級跑車”:西門子TDC系統深度解析與實戰架構

工業自動化領域的“超級跑車”:西門子TDC系統深度解析與實戰架構 文章目錄 工業自動化領域的“超級跑車”:西門子TDC系統深度解析與實戰架構引言:當普通PLC遇到性能瓶頸第一章:認識TDC——它不是簡單的“大型PLC”1.1 TDC究竟是什…

MySQL高階查詢語句與視圖實戰指南

MySQL高階查詢語句與視圖實戰指南 文章目錄MySQL高階查詢語句與視圖實戰指南一、常用高階查詢技巧1. 按關鍵字排序(ORDER BY)基礎用法進階用法:多字段排序條件過濾2. 區間判斷與去重(AND/OR DISTINCT)區間判斷&#x…