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架構。