理解并实现 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 中,它通常指的是 ActivityFragment。View 只负责展示数据,并将用户操作通知给 ViewModel。它应该尽可能地"愚蠢",不包含任何业务逻辑。

ViewModel

ViewModel 是 UI 的数据提供者。它不直接请求数据,而是通过 Repository 来管理数据。ViewModel 也不直接引用 View,它通过 LiveData 或其他观察者模式来通知 UI 数据的变化。

实现 MVVM 架构

让我们通过构建一个简单的用户列表界面来理解 MVVM 的实现。我们将使用以下 Jetpack 组件:

  • LiveData
  • ViewModel
  • View Binding

步骤 1: 配置依赖

首先,在你的 build.gradle (Module: app) 文件中添加以下依赖:

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

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

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

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:

scala 复制代码
// 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 的观察模式确保了只有在 ActivityFragment 处于活动状态时,才会更新 UI 组件。

步骤 5: 测试你的应用

现在你可以运行你的应用程序,并看到 TextView 中显示的用户列表。这个示例非常基础,但它展示了如何将数据从 ViewModel 传递到 View 而不需要 View 知道数据来源的复杂性。

结论

MVVM 是一种强大且灵活的架构模式,它促进了代码的分离和模块化。通过利用 LiveData 和 ViewModel,我们可以创建响应式应用程序,这些应用程序能够优雅地处理生命周期事件和数据管理。此外,View Binding 的使用进一步简化了 UI 代码,使得我们能够避免 findViewById 的繁琐并减少出错的几率。

在实际开发中,你可能还需要引入如 Data Binding、Room、Navigation 等其他 Jetpack 组件来进一步提升应用架构的效率和功能性。

希望这篇博客能帮助你理解并开始使用 MVVM 架构来构建你的 Android 应用。

相关推荐
君莫啸ོ4 分钟前
Android persistent APP调试
android
泥嚎泥嚎5 分钟前
【Android】Handler 全面解析
android
Ehtan_Zheng9 分钟前
WebView 的现代替代方案:适用于 Jetpack Compose 的 AndroidX Browser
android
朝星12 分钟前
Android开发[3]:协程+Flow
android·kotlin
张小潇13 分钟前
AOSP15 WMS/AMS系统开发 - WindowManagerService addWindow详解
android
爱吃牛肉的大老虎30 分钟前
MySQL优化之系统表分析SQL
android·sql·mysql
Fate_I_C39 分钟前
实战案例:用 Kotlin 重写一个 Java Android 工具类
android·java·kotlin
Fate_I_C40 分钟前
Kotlin 特有语法糖
android·开发语言·kotlin
Fate_I_C1 小时前
Kotlin 为什么是 Android 开发的首选语言
android·开发语言·kotlin
黄林晴1 小时前
Android CLI 来了!终端一键建项目、控模拟器、给 Agent 喂官方规范
android