移动应用架构设计:MVVM实战(面向零基础初学者)
一、开篇:MVVM是什么?用来做什么?

你可能已经听说过“MVC”、“MVP”、“MVVM”这些名词,它们都是移动开发中常见的架构模式。今天我们来聊的是MVVM,也就是 Model-View-ViewModel。
简单地说,MVVM 是一种帮助我们更好地组织代码结构的方式。它的核心目标是:
- 让界面和逻辑分离,方便维护;
- 提高代码的可测试性;
- 支持数据绑定,提升交互体验。
在实际开发中,尤其是在 Android 开发中,MVVM 已经成为官方推荐的标准架构之一。如果你未来想成为一名专业的移动开发者,学习 MVVM 架构是你必须掌握的内容!
二、环境准备:搭建你的开发环境

要开始我们的 MVVM 实战,你需要先准备好以下工具:
1. 安装 Android Studio
这是目前最主流的 Android 开发工具,你可以从官网 https://developer.android.com/studio 下载最新版本。
安装完成后,打开 Android Studio,选择:
Start a new Android Studio project
然后选择一个模板,比如 Empty Activity,点击下一步。
2. 选择语言为 Kotlin
Kotlin 是 Google 官方推荐的 Android 开发语言,语法简洁,比 Java 更适合新手入门。
3. 确保 SDK 版本 ≥ 21(Android 5.0)
这是为了保证我们可以使用最新的架构组件。
完成项目创建后,你会看到一个基本的项目结构,包括 MainActivity.kt 和 activity_main.xml 文件,这是我们后续操作的基础。
三、核心概念:用最简单的语言解释 MVVM 中的关键角色

📌 MVVM 的三个组成部分:
| 组件 | 角色 | 类比 |
|---|---|---|
| Model | 数据层,负责管理数据 | 财务部 |
| View | 界面层,负责显示内容 | 客户看到的网站页面 |
| ViewModel | 连接 View 和 Model 的桥梁,处理逻辑 | 销售经理 |
下面我们分别用一句话总结:
- Model:获取或存储数据的地方,比如从网络或数据库读取。
- View:就是你在手机屏幕上看到的那个界面(XML布局文件)。
- ViewModel:帮 View 处理复杂的数据和逻辑,同时不去碰 View。
这样做的好处是:即使以后换了 UI 设计师,你的 ViewModel 也可以继续复用,不会互相干扰。
🔍 数据绑定简介
MVVM 非常适合结合 数据绑定技术(Data Binding) 来使用。通俗点说,就是你可以直接让界面上的 TextView 显示 ViewModel 中的一个变量,而不用手动写很多 findViewById 去更新它。
四、实战项目:一步步实现一个天气应用
现在,我们通过一个简单的“城市天气查询”App 来实操一遍 MVVM 架构。这个 App 会有一个输入框让用户输入城市名,然后点击按钮,显示天气信息(模拟数据)。
步骤 1:添加依赖项
为了让我们的项目支持 ViewModel 和 LiveData(后面会讲),我们需要在 build.gradle (Module) 中添加如下依赖:
implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.1'
implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.6.1'
implementation 'androidx.activity:activity-ktx:1.7.2'
Sync Project 后即可生效。
步骤 2:构建 Model 层
新建一个 Kotlin 文件,叫 WeatherRepository.kt,作为我们的数据仓库:
class WeatherRepository {
// 模拟获取天气的方法
fun getWeather(city: String): String {
// 这里可以换成真实接口请求
return when(city.lowercase()) {
"beijing" -> "北京今天晴天,20°C"
"shanghai" -> "上海今天多云,24°C"
else -> "未知城市天气"
}
}
}
步骤 3:构建 ViewModel 层
新建一个类 WeatherViewModel.kt:
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
class WeatherViewModel : ViewModel() {
private val repository = WeatherRepository()
// LiveData 是用于观察数据变化的容器
private val _weatherText = MutableLiveData<String>()
val weatherText: LiveData<String> get() = _weatherText
// 暴露一个方法给 View 调用
fun queryWeather(city: String) {
val result = repository.getWeather(city)
_weatherText.value = result
}
}
这里用了两个新概念:
MutableLiveData:可以修改的可观察数据;LiveData:只读的,用于暴露给 View 使用。
步骤 4:配置 View 层(Activity + XML)
修改 activity_main.xml
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="16dp">
<EditText
android:id="@+id/editCity"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="请输入城市名"/>
<Button
android:id="@+id/btnQuery"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="查询天气"/>
<TextView
android:id="@+id/tvResult"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:textSize="18sp"/>
</LinearLayout>
修改 MainActivity.kt
import android.os.Bundle
import androidx.activity.viewModels
import androidx.appcompat.app.AppCompatActivity
import androidx.lifecycle.Observer
import kotlinx.android.synthetic.main.activity_main.*
class MainActivity : AppCompatActivity() {
// 获取 ViewModel 实例(由系统自动管理生命周期)
private val viewModel: WeatherViewModel by viewModels()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// 设置点击事件
btnQuery.setOnClickListener {
val city = editCity.text.toString()
viewModel.queryWeather(city)
}
// 观察 LiveData 数据变化
viewModel.weatherText.observe(this, Observer { weather ->
tvResult.text = weather
})
}
}
✅ 至此,一个完整的 MVVM 结构就完成了!
五、常见问题:新手容易遇到的问题及解答
❓ 1. 为什么不能直接在 Activity 里写网络请求?
答:Activity 主要是负责 UI 控制,不应该承担数据逻辑的工作。将网络请求放在 ViewModel 或 Repository 中,能让逻辑更清晰,也更容易测试和维护。
❓ 2. MutableLiveData 和 LiveData 的区别?
答:MutableLiveData 是可变的,通常在 ViewModel 内部使用;而 LiveData 是只读的,用于暴露给外界(如 Activity)监听数据变化。
❓ 3. 为什么用 ViewModel 而不是普通类?
答:ViewModel 具有生命周期意识,在屏幕旋转等配置变更时不会被销毁,从而避免不必要的重复请求和资源浪费。
❓ 4. MVVM 和 MVC 的区别在哪?
答:在 MVC 中,Controller 直接操作 View,耦合度高;而在 MVVM 中,View 只和 ViewModel 通信,大大降低了模块间的依赖关系。
六、学习建议:接下来可以学什么?
恭喜你成功完成了第一个 MVVM 项目!你现在掌握了以下几个能力:
- 搭建基本的 Android 开发环境;
- 理解并实践了 MVVM 架构的核心思想;
- 掌握了 LiveData 和 ViewModel 的使用方式;
- 编写了一个简单的天气查询 App。
接下来,你可以顺着以下路径继续深入:
✅ 初级阶段(现在)
- 学习 Jetpack 组件:Room、Navigation、DataStore;
- 熟练使用协程 Coroutine 与 Retrofit;
- 尝试将项目迁移到 Jetpack Compose(新的声明式 UI 框架)。
✅ 中级阶段(1~3个月)
- 学习 Dagger/Hilt 进行依赖注入;
- 理解 Clean Architecture 分层架构;
- 掌握单元测试(JUnit、Mockito);
- 学习如何使用 Paging 加载分页数据。
✅ 高级阶段(6个月以上)
- 深入源码,理解 ViewModel、LiveData 底层机制;
- 研究性能优化、内存泄漏排查;
- 掌握多模块化开发、组件化架构;
- 熟悉 CI/CD 流程与自动化部署。
总结
通过这篇教程,你已经掌握了:
- MVVM 是什么以及它为什么重要;
- 如何搭建一个 MVVM 架构的项目;
- 实现了一个简单的 MVVM 示例(天气查询 App);
- 解决了一些初学者常见疑问;
- 明确了接下来的学习路径。
希望你能坚持下去,把 MVVM 的理念真正融入到你的每一个项目中。当你再回过头看这段学习过程时,你会发现这一切都非常值得!
🔚 文章字数约:2767字

评论 0