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

山海写码人
2025-06-20 01:58
阅读 690

一、开篇: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.ktactivity_main.xml 文件,这是我们后续操作的基础。


三、核心概念:用最简单的语言解释 MVVM 中的关键角色

应用商店发布流程-1

📌 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

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