移动应用架构设计:MVVM实战(面向零基础初学者)

优秀的算法
2025-06-19 06:33
阅读 274

开篇:MVVM 是什么?它为什么重要?

开篇:MVVM 是什么?它为什么重要?

想象一下你正在做一个蛋糕,你要把所有材料(面粉、鸡蛋、糖)先准备好,再一步步地加工成成品。在移动开发中,我们写的应用程序也类似——需要把数据处理和界面展示分开管理。

MVVM(Model-View-ViewModel) 就是一种帮助我们“分层做蛋糕”的结构方式。它的核心思想是:

让界面代码与业务逻辑分离,让代码更容易维护和测试。

这在开发大型 App 时尤其重要。使用 MVVM,你可以更清晰地组织项目结构,提高代码可读性,还能让你以后换公司或者团队时,更容易接手别人的代码。

为什么要学 MVVM?

  1. 📈 大多数主流 Android 开发框架(如 Jetpack)默认使用 MVVM。
  2. 🎯 提高代码质量,避免“面条式代码”(Spaghetti Code)。
  3. 🧪 更容易进行单元测试。
  4. 💼 市场需求大,面试常考内容!

环境准备:搭建你的第一个开发环境

环境准备:搭建你的第一个开发环境

我们以 Android 平台为例,使用 Kotlin + Android Studio 来完成本次实战。

第一步:安装 Android Studio

  1. 访问官网 https://developer.android.com/studio
  2. 下载对应操作系统的版本
  3. 安装完成后打开 Android Studio

第二步:创建新项目

  1. 打开 Android Studio,点击 Start a new Android Studio project
  2. 选择模板:Empty Activity
  3. 项目名称建议命名为 MyMvvmApp
  4. 语言选择 Kotlin
  5. 其他保持默认即可

等待 Gradle 构建完成后,你的项目就准备好了!


核心概念:通俗易懂讲明白 MVVM 的组成

核心概念:通俗易懂讲明白 MVVM 的组成

MVVM 包含三部分:

1. Model(模型)

➡️ 你可以把它理解为“蛋糕原料”,也就是数据的来源和处理方法。

举个例子:

data class User(val id: Int, val name: String)

object UserRepository {
    fun getUser(): User {
        // 模拟从网络或数据库获取数据
        return User(1, "张三")
    }
}

2. View(视图)

➡️ 用户看到的界面,比如按钮、文字、图片等。

在 Android 中,通常指的是你的 XML 文件(布局文件),例如:

<TextView
    android:id="@+id/userNameTextView"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Hello World!" />

3. ViewModel(视图模型)

➡️ 连接 View 和 Model 的桥梁。它负责准备数据,并将数据绑定给 View 显示。

class UserViewModel : ViewModel() {
    private val _user = MutableLiveData<User>()
    val user: LiveData<User> get() = _user

    init {
        loadUser()
    }

    private fun loadUser() {
        val userFromRepo = UserRepository.getUser()
        _user.postValue(userFromRepo)
    }
}

📌 ViewModel 的特点:

  • 不持有任何 View 的引用,避免内存泄漏
  • 数据变更后通知 View 自动更新

实战项目:跟着我一起写一个简单的用户信息展示 App

应用商店发布流程-1

实战项目:跟着我一起写一个简单的用户信息展示 App

目标:展示用户的姓名和 ID,数据来自 Repository。

第一步:添加 ViewModel 支持

build.gradle (Module) 添加如下依赖:

implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.1'
implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.6.1'

然后 Sync Now。


第二步:创建 Model(User 和 UserRepository)

新建 Kotlin 文件 User.ktUserRepository.kt

User.kt

data class User(val id: Int, val name: String)

UserRepository.kt

object UserRepository {
    fun getUser(): User {
        // 模拟获取数据
        return User(1001, "李华")
    }
}

第三步:创建 ViewModel

新建 UserViewModel.kt

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

class UserViewModel : ViewModel() {

    private val _user = MutableLiveData<User>()
    val user: LiveData<User> get() = _user

    fun loadUser() {
        val data = UserRepository.getUser()
        _user.postValue(data)
    }
}

第四步:连接 ViewModel 和 View(Activity)

修改 MainActivity.kt 内容如下:

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

class MainActivity : AppCompatActivity() {

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

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

        // 监听数据变化并更新 UI
        viewModel.user.observe(this, Observer { user ->
            binding.userNameTextView.text = "用户名:${user.name}"
            binding.userIdTextView.text = "ID:${user.id}"
        })

        viewModel.loadUser()
    }
}

第五步:修改布局文件(activity_main.xml)

确保有这两个 TextView(可以自己添加):

<TextView
    android:id="@+id/usernameTextView"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textSize="18sp"
    android:layout_marginTop="16dp"/>

<TextView
    android:id="@+id/userIdTextView"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textSize="16sp"
    android:layout_marginTop="8dp"/>

⚠️ 注意:请确保 binding.textView 中的变量名与 XML 中的 id 名称一致。


效果预览

运行 App 后,界面上应该会显示:

用户名:李华
ID:1001

恭喜!你已经成功实现了 MVVM 架构的第一个小项目 🎉


新手常见问题解答(FAQ)

❓ Q1:ViewModel 和 Activity 的生命周期有什么关系?

答:ViewModel 存在于 Activity 销毁前都不会被销毁,即使屏幕旋转也不会重置。因此非常适合用来保存临时数据。


❓ Q2:LiveData 和 MutableLiveData 有什么区别?

答:

  • MutableLiveData 可以被修改(用 _user.postValue()
  • LiveData 是只读的,适合提供给外部观察变化(用 user.observe(...)

建议 ViewModel 里对外暴露 LiveData,而不是 MutableLiveData


❓ Q3:ViewModel 能传参吗?

答:默认的 by viewModels() 不支持传递参数。如果想传参,需要自定义 ViewModelProvider.Factory


❓ Q4:可以用 MVVM 来做复杂的功能吗?

答:当然可以!MVVM 正是为了应对复杂业务而诞生的。随着你学习深入,你会发现配合 Room 数据库Retrofit 网络请求,再加上 MVVM,可以构建非常强大的 App!


学习建议:下一步你可以怎么学?

✅ 初级进阶建议

阶段 学习内容 推荐资源
1 学会使用 ViewModel 和 LiveData 官方文档、YouTube 入门教程
2 学习 Room 数据库(本地存储) Android Room 持久化官方指南
3 引入 Retrofit 或 Ktor 做网络请求 Retrofit 官方 GitHub
4 使用 Kotlin 协程(Coroutines)处理异步任务 Kotlin Coroutines 官方文档
5 学习用 Navigation 组件实现页面跳转 Android 官方 Jetpack Navigation 文档

🔁 实战练习建议

  • ✍️ 练手项目一:待办事项(Todo List)App
  • ✍️ 练手项目二:天气预报 App
  • ✍️ 练手项目三:新闻资讯 App(网络 + 数据库 + 页面交互)

结语:坚持就是进步的关键!

恭喜你完成了第一篇关于 MVVM 的完整入门教程 🎊
你现在拥有了扎实的基础,可以继续向更复杂的项目迈进。

如果你觉得这篇文章对你有帮助,请收藏 + 分享给朋友。下一篇文章我们将一起学习《使用 Retrofit 获取网络数据》!


🎯 记住一句话:编程不是背公式,而是多动手、勤实践

加油,未来的移动端高手!🚀

评论 0

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