移动应用架构设计:MVVM实战(零基础入门教程)

API打磨师
2025-12-19 08:23
阅读 1631

大家好,我是B站的一名技术UP主,也是某大厂有3年经验的Android开发工程师。今天写这篇教程,是因为我当初学 MVVM 的时候踩过太多坑了——文档晦涩、概念抽象、代码看不懂……所以这次我想用最简单、最实践的方式,带你从零开始搭建一个真正的 MVVM 架构应用。这篇文章不讲理论堆砌,只讲实战经验+可运行代码,适合完全零基础的同学!

一、MVVM 是什么?为什么我们要用它?

MVVM 是一种移动应用架构模式,全称是 Model-View-ViewModel。它的核心目标就一个:让代码更清晰、更容易维护、更容易测试

想象一下,你写一个登录页面:

  • 用户输入账号密码(View)
  • 点击登录后要验证格式、调用网络接口(逻辑)
  • 登录成功后跳转主页(UI 变化)

如果不使用架构,所有逻辑可能都塞在 Activity 里,代码又长又乱。而 MVVM 把这些职责拆开:

角色 职责
Model 负责数据(比如网络请求、数据库)
View 负责 UI 展示(Activity/Fragment)
ViewModel 连接 Model 和 View,处理业务逻辑

💡 我当初学的时候以为 ViewModel 就是个“中间人”,后来才发现它是生命周期感知的——即使屏幕旋转,数据也不会丢失!这才是 MVVM 的真正优势。


二、环境准备(Android 开发)

我们以 Android 为例(iOS 原理类似,但代码不同)。你需要:

  1. 安装 Android Studio(最新稳定版)
  2. 创建一个新项目:Empty Activity
  3. app/build.gradle 中添加以下依赖(这是 MVVM 的核心“资源”):
dependencies {
    // ViewModel + LiveData(Google 官方架构组件)
    implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.2"
    implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.6.2"

    // 协程(用于异步操作)
    implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.1"
}

✅ 注意:确保你的项目使用 Kotlin(现在新建项目默认就是 Kotlin)

同步 Gradle 后,环境就准备好了!


三、核心概念通俗解释

1. ViewModel

  • 不是 UI 组件,而是存放 UI 相关数据的类
  • 不会因为屏幕旋转被销毁(比 Presenter 更稳)
  • View(Activity)通过它获取数据

2. LiveData

  • 一种“可观察的数据持有者”
  • 当数据变化时,自动通知 View 更新 UI
  • 自动处理生命周期:Activity 销毁后不会回调,避免内存泄漏

3. Model

  • 可以是 Repository(仓库)、Retrofit 接口、Room 数据库等
  • ViewModel 调用 Model 获取数据

🚫 新手误区:不要把网络请求直接写在 ViewModel 里!应该通过 Repository 封装。


四、实战项目:做一个“用户信息展示页”

我们来做一个简单功能:点击按钮,从“假数据”中加载用户姓名并显示。

步骤 1:创建 Model(数据源)

// User.kt
data class User(val name: String)

// UserRepository.kt
class UserRepository {
    // 模拟网络请求(实际项目中这里会调用 Retrofit)
    suspend fun fetchUser(): User {
        // 模拟延迟
        delay(1000)
        return User("张三")
    }
}

💡 使用 suspend 是为了配合协程做异步操作。


步骤 2:创建 ViewModel

// UserViewModel.kt
class UserViewModel : ViewModel() {
    private val repository = UserRepository()

    // 用 MutableLiveData 存储可变数据
    private val _userName = MutableLiveData<String>()
    // 对外暴露不可变的 LiveData
    val userName: LiveData<String> = _userName

    fun loadUser() {
        viewModelScope.launch {
            try {
                val user = repository.fetchuser()
                _userName.value = user.name
            } catch (e: Exception) {
                _userName.value = "加载失败"
            }
        }
    }
}

🔍 关键点:

  • viewModelScope:自动在 ViewModel 销毁时取消协程
  • _userName 是私有的,防止外部修改数据
  • userName 是公开的,View 只能观察

步骤 3:编写 View(Activity)

// MainActivity.kt
class MainActivity : AppCompatActivity() {
    private lateinit var binding: ActivityMainBinding
    private lateinit var viewModel: UserViewModel

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

        // 创建 ViewModel 实例
        viewModel = ViewModelProvider(this)[UserViewModel::class.java]

        // 观察数据变化
        viewModel.userName.observe(this) { name ->
            binding.textView.text = name
        }

        // 点击按钮加载数据
        binding.button.setOnClickListener {
            viewModel.loadUser()
        }
    }
}

对应的布局文件 activity_main.xml

<!-- 只需一个 TextView 和一个 Button -->
<LinearLayout ...>
    <TextView
        android:id="@+id/textView"
        android:text="点击加载用户" />
    
    <Button
        android:id="@+button"
        android:text="加载用户" />
</LinearLayout>

步骤 4:运行效果

  1. 启动 App,显示“点击加载用户”
  2. 点击按钮,1秒后显示“张三”
  3. 旋转屏幕:数据不会重新加载,UI 依然显示“张三”(这就是 ViewModel 的生命周期优势!)

✅ 这就是完整的 MVVM 流程: View → 调用 ViewModel → ViewModel 调用 Model → Model 返回数据 → ViewModel 更新 LiveData → View 自动刷新


五、新手常见问题 & 解答

❓ 1. 为什么不能直接在 Activity 里写网络请求?

答:会导致代码耦合、难以测试、屏幕旋转时请求重复执行。MVVM 把逻辑抽离,Activity 只负责“展示”。

❓ 2. LiveData 和普通变量有什么区别?

答:LiveData 是“可观察”的。普通变量变了,UI 不会自动更新;而 LiveData 一变,所有观察者立刻收到通知。

❓ 3. ViewModel 会内存泄漏吗?

答:不会!Google 的 ViewModel 是绑定到 Activity/Fragment 生命周期的,它们销毁时 ViewModel 也会自动清理。

❓ 4. 一定要用协程吗?

答:不是必须,但强烈推荐。你也可以用 RxJava 或 Callback,但协程更简洁、更 Kotlin。


六、学习建议 & 下一步

✅ 巩固练习

  1. 在上面项目中增加“加载中”状态(用 MutableLiveData<Boolean> 控制 ProgressBar)
  2. 尝试从真实 API 获取数据(比如用 Retrofit 替换 UserRepository

📚 推荐学习路径

阶段 内容
入门 掌握 ViewModel + LiveData + 协程
进阶 引入 Repository 模式、Room 数据库
高级 结合 Hilt/Dagger 实现依赖注入、使用 StateFlow 替代 LiveData

⚠️ 避坑指南(来自我的实战经验)

  • 不要在 ViewModel 中持有 Context!这会导致内存泄漏。
  • LiveData 只适合 UI 状态,不要用来传递事件(比如“弹出 Toast”),否则会因生命周期导致事件丢失。
  • 小项目也值得用 MVVM!别觉得“太重”,它能让你从第一天就写出可维护的代码。

结语

MVVM 不是银弹,但它是 Google 官方推荐、经过大厂验证的架构模式。我当初花了两周才搞懂,希望这篇教程能让你1小时上手。记住:架构的目的不是炫技,而是让未来的你(和同事)感谢现在的自己

如果你跟着做了这个小项目,恭喜你已经迈出了专业开发的第一步!欢迎在评论区留言你的问题,我会一一解答。如果觉得有用,不妨去 B站 搜我的名字,那里有更多实战视频等着你!

本文所有代码均可运行,关键依赖已列出。如遇问题,优先检查 Gradle 版本和 Kotlin 协程配置。

评论 0

最热最新
暂无评论
API打磨师Lv.1
0
影响力
0
文章
0
粉丝