理解並實現 Android MVVM 架構

Android MVVM 架構

在現代 Android 開發中,維護一個清晰、可測試和模塊化的代碼庫變得至關重要。Google 推薦的架構實踐是使用 MVVM(Model-View-ViewModel)模式,它是響應式編程思想在 Android 應用開發中的體現。在本文中,我們將深入探討 MVVM 架構,並通過一個簡單的示例演示如何在 Android 應用程序中實現它。

MVVM 架構概述

MVVM 架構分爲三個核心組件:

以下是每個組件的職責:

Model

Model 包含了應用程序的數據處理部分。通常,Model 可以進一步分爲幾個部分:

View

View 是用戶看到並與之交互的屏幕。在 Android 中,它通常指的是 Activity 或 Fragment。View 只負責展示數據,並將用戶操作通知給 ViewModel。它應該儘可能地 "愚蠢",不包含任何業務邏輯。

ViewModel

ViewModel 是 UI 的數據提供者。它不直接請求數據,而是通過 Repository 來管理數據。ViewModel 也不直接引用 View,它通過 LiveData 或其他觀察者模式來通知 UI 數據的變化。

實現 MVVM 架構

讓我們通過構建一個簡單的用戶列表界面來理解 MVVM 的實現。我們將使用以下 Jetpack 組件:

步驟 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