理解並實現 Android MVVM 架構
Android MVVM 架構
在現代 Android 開發中,維護一個清晰、可測試和模塊化的代碼庫變得至關重要。Google 推薦的架構實踐是使用 MVVM(Model-View-ViewModel)模式,它是響應式編程思想在 Android 應用開發中的體現。在本文中,我們將深入探討 MVVM 架構,並通過一個簡單的示例演示如何在 Android 應用程序中實現它。
MVVM 架構概述
MVVM 架構分爲三個核心組件:
-
Model - 表示應用程序的數據和業務邏輯,例如網絡請求、數據庫交互等。
-
View - 表示應用程序的 UI 組件,例如 Activities 和 Fragments。
-
ViewModel - 充當 View 和 Model 之間的中介。它處理從 Model 獲取的數據,使其適用於 View 顯示,同時也響應 View 的用戶交互。
以下是每個組件的職責:
Model
Model 包含了應用程序的數據處理部分。通常,Model 可以進一步分爲幾個部分:
-
Repository: 提供數據的 API,它決定從本地數據庫或網絡獲取數據。
-
Local Data Source: 如 SQLite 數據庫或 Room。
-
Remote Data Source: 如 Retrofit 或其他網絡請求庫。
View
View 是用戶看到並與之交互的屏幕。在 Android 中,它通常指的是 Activity
或 Fragment
。View 只負責展示數據,並將用戶操作通知給 ViewModel。它應該儘可能地 "愚蠢",不包含任何業務邏輯。
ViewModel
ViewModel 是 UI 的數據提供者。它不直接請求數據,而是通過 Repository 來管理數據。ViewModel 也不直接引用 View,它通過 LiveData 或其他觀察者模式來通知 UI 數據的變化。
實現 MVVM 架構
讓我們通過構建一個簡單的用戶列表界面來理解 MVVM 的實現。我們將使用以下 Jetpack 組件:
-
LiveData
-
ViewModel
-
View Binding
步驟 1: 配置依賴
首先,在你的 build.gradle (Module: app)
文件中添加以下依賴:
dependencies {
// ViewModel 和 LiveData
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1"
implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.3.1"
// View Binding
buildFeatures {
viewBinding true
}
}
步驟 2: 創建 Model
// User.java
public class User {
private int id;
private String name;
public User(int id, String name) {
this.id = id;
this.name = name;
}
// Getters and setters
public int getId() {
return id;
}
public String getName() {
return name;
}
}
步驟 3: 創建 ViewModel
// MainViewModel.java
import androidx.lifecycle.MutableLiveData;
import androidx.lifecycle.ViewModel;
import java.util.Arrays;
import java.util.List;
public class MainViewModel extends ViewModel {
private MutableLiveData<List<User>> users = new MutableLiveData<>();
public MainViewModel() {
loadUsers();
}
public MutableLiveData<List<User>> getUsers() {
return users;
}
private void loadUsers() {
// 通常這裏會是調用 Repository 層的代碼
List<User> dummyUsers = Arrays.asList(new User(1, "Alice"), new User(2, "Bob"));
users.setValue(dummyUsers);
}
}
步驟 4: 創建 View
在 activity_main.xml
:
<!-- activity_main.xml -->
<LinearLayout ...>
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
在 MainActivity.kt
中使用 View Binding 和 ViewModel:
// MainActivity.kt
package com.example.myapp;
import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;
import androidx.lifecycle.ViewModelProvider;
import com.example.myapp.databinding.ActivityMainBinding;
public class MainActivity extends AppCompatActivity {
private MainViewModel mainViewModel;
private ActivityMainBinding binding;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 初始化 View Binding
binding = ActivityMainBinding.inflate(getLayoutInflater());
setContentView(binding.getRoot());
// 初始化 ViewModel
mainViewModel = new ViewModelProvider(this).get(MainViewModel.class);
// 觀察 ViewModel 中的 LiveData 對象
mainViewModel.getUsers().observe(this, users -> {
// 更新 UI
StringBuilder userInfo = new StringBuilder();
for (User user : users) {
userInfo.append(user.getName()).append("\n");
}
binding.textView.setText(userInfo.toString());
});
}
}
記住,LiveData
的觀察模式確保了只有在 Activity
或 Fragment
處於活動狀態時,纔會更新 UI 組件。
步驟 5: 測試你的應用
現在你可以運行你的應用程序,並看到 TextView
中顯示的用戶列表。這個示例非常基礎,但它展示瞭如何將數據從 ViewModel 傳遞到 View 而不需要 View 知道數據來源的複雜性。
結論
MVVM 是一種強大且靈活的架構模式,它促進了代碼的分離和模塊化。通過利用 LiveData 和 ViewModel,我們可以創建響應式應用程序,這些應用程序能夠優雅地處理生命週期事件和數據管理。此外,View Binding 的使用進一步簡化了 UI 代碼,使得我們能夠避免 findViewById
的繁瑣並減少出錯的幾率。
在實際開發中,你可能還需要引入如 Data Binding、Room、Navigation 等其他 Jetpack 組件來進一步提升應用架構的效率和功能性。
希望這篇博客能幫助你理解並開始使用 MVVM 架構來構建你的 Android 應用。
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/X9pR1WEBCsdbRlXoS9fWtQ