移动应用架构设计:MVVM实战教程

技术乌托邦
2025-06-25 15:44
阅读 780

开篇:什么是 MVVM?它有什么用?

开篇:什么是 MVVM?它有什么用?

在开发一个手机App时,你可能发现随着功能越来越多,代码也会越来越乱。这时候,我们需要一种“组织方式”,让我们的代码更有条理、容易维护——这就是架构模式的作用。

MVVM(Model-View-ViewModel)是一种专门为现代移动开发设计的架构模式,尤其适合使用像 Android 的 Jetpack ViewModel 和 LiveDataiOS 的 SwiftUI + Combine 这类响应式框架的项目。

简单来说:

  • View(视图) 就是你看到的界面部分(按钮、文本框等)
  • ViewModel 是连接 View 和 Model 的中间人,负责处理界面逻辑
  • Model(模型) 就是负责管理数据和业务逻辑的部分,比如联网获取数据、本地数据库操作等

使用 MVVM 有以下几个好处:

  • 代码结构清晰,职责分明
  • 易于测试和调试
  • 提高可维护性和团队协作效率

这篇文章将手把手带你从零开始理解并实践 MVVM 架构,通过一个小项目来加深理解。


环境准备:搭建你的开发环境

环境准备:搭建你的开发环境

工具需求:

我们以 Android 平台为例,使用 Kotlin 编程语言来实现 MVVM。

你需要准备以下工具:

  1. Android Studio

  2. Kotlin 插件

    • Android Studio 默认已集成 Kotlin 支持
    • 新建项目时记得选择 Kotlin 作为开发语言
  3. 熟悉基本语法(如变量、函数、类等)

如果你是 iOS 开发者,也可以参考后面章节的适配建议,本文重点讲解 Android 示例。


核心概念详解:通俗易懂地解释 MVVM

核心概念详解:通俗易懂地解释 MVVM

我们将用一个非常简单的 App 来说明 MVVM 的每个组成部分:显示一段欢迎语,并提供一个按钮更改文字内容。

1. Model:数据和业务逻辑

这部分负责处理“后台”工作,例如请求网络数据、读写数据库或一些计算逻辑。

示例:

// Model 类:用于管理数据
class WelcomeMessageModel {
    fun getWelcomeMessage(): String {
        return "Hello, welcome to our app!"
    }

    fun updateMessage(newMessage: String): String {
        // 实际中可以进行保存到数据库等操作
        return newMessage
    }
}

📌 小贴士:

  • Model 层不应该直接与界面交互
  • 而应该专注于数据管理和业务逻辑

2. ViewModel:中介桥梁

ViewModel 是 MVVM 中最核心的角色。它的任务是:

  • 接收来自 View 的请求
  • 调用 Model 获取/处理数据
  • 把结果准备好给 View 显示

在 Android 中我们使用 androidx.lifecycle.ViewModel 类。

示例:

import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel

class MainViewModel : ViewModel() {
    private val _message = MutableLiveData<String>()
    val message: LiveData<String> get() = _message

    private val model = WelcomeMessageModel()

    init {
        _message.value = model.getWelcomeMessage()
    }

    fun changeMessage(newText: String) {
        _message.value = model.updateMessage(newText)
    }
}

📌 解释:

  • _message 是私有的 MutableLiveData,表示可变的数据源
  • message 是对外只读的 LiveData,View 只能观察不能修改
  • init 是初始化方法,程序启动时自动调用
  • changeMessage() 是暴露给 View 的行为接口

3. View:展示界面内容

在 Android 中通常指的是 ActivityFragment,它们负责显示内容和接收用户输入。

示例:

import android.os.Bundle
import androidx.activity.viewModels
import androidx.appcompat.app.AppCompatActivity
import androidx.lifecycle.Observer
import com.example.myapp.databinding.ActivityMainBinding

class MainActivity : AppCompatActivity() {

    private lateinit var binding: ActivityMainBinding
    private val viewModel: MainViewModel by viewModels()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)

        // 观察 LiveData,自动刷新 UI
        viewModel.message.observe(this, Observer { msg ->
            binding.textView.text = msg
        })

        binding.button.setOnClickListener {
            viewModel.changeMessage("You clicked the button!")
        }
    }
}

📌 解释:

  • 使用 by viewModels() 自动创建 ViewModel 实例
  • binding.textViewbinding.button 是通过 ViewBinding 自动生成的控件引用
  • 使用 observe() 监听 LiveData 的变化,实时更新界面

实战项目:一步步完成你的第一个 MVVM 应用

实战项目:一步步完成你的第一个 MVVM 应用

接下来我们将动手做一个完整的 Demo App。目标是:

在屏幕上显示一句话,点击按钮后,句子会变成新内容。

第一步:创建新项目

  1. 打开 Android Studio
  2. 选择 "New Project"
  3. 选择模板 “Empty Activity”
  4. 勾选 “Use view binding?” → YES
  5. 选择语言为 Kotlin
  6. 其余保持默认即可

第二步:添加 ViewModel 依赖项

build.gradle (Module) 文件中添加:

dependencies {
    implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.1'
    implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.6.1'
}

同步 Gradle。


第三步:编写 ViewModel 类

新建文件 MainViewModel.kt,内容如下:

import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel

class MainViewModel : ViewModel() {
    private val _message = MutableLiveData<String>()
    val message: LiveData<String> get() = _message

    init {
        _message.value = "Welcome to MVVM Tutorial!"
    }

    fun updateMessage(newMessage: String) {
        _message.value = newMessage
    }
}

第四步:编写布局 XML

打开 res/layout/activity_main.xml(或使用 Binding 自动生成的布局),确保有以下控件:

<TextView
    android:id="@+id/textView"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Hello World!"
    android:textSize="24sp"
    android:layout_marginTop="50dp"
    android:layout_centerHorizontal="true"
    />

<Button
    android:id="@+id/button"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Click Me"
    android:layout_below="@id/textView"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="30dp"
    />

第五步:更新 MainActivity

修改 MainActivity.kt

import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import androidx.lifecycle.Observer
import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.viewmodel.viewModelFactory
import com.example.mvvmexample.databinding.ActivityMainBinding

class MainActivity : AppCompatActivity() {

    private lateinit var binding: ActivityMainBinding
    private lateinit var viewModel: MainViewModel

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)

        // 创建 ViewModel 实例
        viewModel = ViewModelProvider(this).get(MainViewModel::class.java)

        // 绑定 LiveData 到 TextView
        viewModel.message.observe(this, Observer { message ->
            binding.textView.text = message
        })

        // 设置按钮点击事件
        binding.button.setOnClickListener {
            viewModel.updateMessage("You just clicked a button!")
        }
    }
}

📌 注意:

  • 我们手动创建了 ViewModel 实例用于演示目的
  • 实际中推荐使用 by viewModels() 更简洁

第六步:运行 App!

点击 Android Studio 的运行按钮,等待安装完成后,你会看到:

  • 初始显示一句话:“Welcome to MVVM Tutorial!”
  • 点击按钮后变为:“You just clicked a button!”

恭喜你,你已经完成了第一个基于 MVVM 架构的 App!


常见问题解答

Q1:为什么要用 LiveData 和 ViewModel,而不是直接操作 UI?

A:直接操作 UI 会导致代码混乱、难以测试和维护。LiveData 是“可观察”的数据类型,它可以自动通知 UI 更新,避免手动处理生命周期导致的崩溃。

Q2:为什么 ViewModel 不应该持有 Context?

A:如果 ViewModel 持有 Context(比如 Activity 的上下文),可能会引起内存泄漏。Context 是与界面相关的,而 ViewModel 是设计为不感知界面的。

Q3:我可以用 MVVM 做复杂的项目吗?

A:当然可以!MVVM 特别适合大型项目,因为它把各个组件分离开,便于多人协作、单元测试、后期扩展。

Q4:我可以不用 ViewBinding 吗?

A:可以,但 ViewBinding 能帮助我们快速绑定控件,减少 findViewById 调用,提高代码可读性。


学习建议:下一步该学什么?

你现在已经掌握了 MVVM 的基础。下面是一些进一步学习的方向建议:

✅ 1. 加入 Repository 层(进阶)

  • 使用 Repository 来统一管理 Model 数据源,比如区分本地缓存和远程服务器

✅ 2. 使用 Room 数据库(持久化)

  • 学习如何用 Room 把数据保存到设备上

✅ 3. 结合 Retrofit 进行网络请求

  • 学习如何从服务器获取 JSON 数据并显示在界面上

✅ 4. 使用协程(Coroutines)简化异步任务

  • 避免主线程阻塞,更好地处理耗时操作

✅ 5. 实践更复杂项目(如笔记应用、天气 App)

  • 把所学知识真正应用到实际项目中去

总结

原生应用架构-1

在这篇文章中,我们从零开始了解了什么是 MVVM 架构,并通过一个简易 Demo 实现了它的三个核心组件:

  • Model 处理数据
  • ViewModel 中介协调
  • View 显示界面

整个过程注重实操、讲解通俗,让你更容易理解和上手。

希望这篇教程能帮你打下扎实的 MVVM 基础,迈出成为专业移动开发者的第一步!

如果你喜欢这样的教程,欢迎关注后续课程《高级 MVVM 模式与实战》、《Jetpack Compose 入门》等内容。


文章总字数:约2922字

评论 0

最热最新
暂无评论
匿名用户Lv.1
0
影响力
0
文章
0
粉丝