第一章:Android架构演进总览
从MVC到MVVM再到MVI,架构演进的驱动力与核心思想
大家好,我是你们的老朋友。
今天咱们聊聊Android架构的演进史。说实话,这个话题我讲了不下几十次,但每次都有新感悟。你想想看,从最早的MVC到现在的MVI,这中间经历了多少坑?我入行那会儿,项目里连个架构都没有,Activity里塞了几千行代码是常态。嗯,那会儿我们管这叫“能跑就行”。
一、MVC时代:混乱的起点
MVC,Model-View-Controller,听起来挺正规的。但Android里的MVC,说白了就是Activity既当View又当Controller。Model层?往往就是个空壳。
核心问题在哪?耦合太严重了。我记得有个项目,一个Activity里既有网络请求、又有数据库操作、还有UI更新。改个需求,得翻半天代码。更别提单元测试了——根本没法测。
MVC的典型痛点:
- Activity/Fragment过于臃肿,动辄上千行
- 业务逻辑和UI逻辑混在一起,难以维护
- 测试困难,Mock成本高
- 团队协作效率低,经常冲突
我曾经接手过一个MVC项目,光是一个登录页面就有800行代码。改个按钮颜色,都得小心翼翼,生怕碰了哪块业务逻辑。那感觉,就像在雷区里跳舞。
二、MVP登场:解耦的曙光
MVP,Model-View-Presenter。它把Controller换成了Presenter,View只负责UI,Presenter处理业务逻辑。这招确实管用,至少Activity瘦身了。
但MVP也有自己的问题。最典型的就是接口爆炸。每个页面都得定义View接口和Presenter接口,项目大了以后,接口文件比业务代码还多。我有个项目,MVP模式用了两年,最后接口文件占了三分之一。
我的建议:MVP适合中小型项目,或者团队对架构理解不深时过渡使用。但别指望它能解决所有问题。
还有一个坑:Presenter的生命周期管理。Activity销毁了,Presenter还在跑,容易内存泄漏。我曾经因为这个被线上bug追着跑了一周,后来老老实实加了弱引用。
三、MVVM:数据驱动的革命
MVVM,Model-View-ViewModel。它引入了数据绑定,ViewModel自动感知数据变化并更新UI。这简直是解放生产力啊!
核心思想:ViewModel不持有View的引用,通过LiveData或StateFlow通知UI变化。生命周期安全,测试也方便。
MVVM的优势:
- ViewModel与View解耦,生命周期安全
- 数据驱动UI,减少手动更新代码
- 便于单元测试,ViewModel可独立测试
- 团队协作更清晰,各司其职
我个人习惯用MVVM + Jetpack Compose的组合。ViewModel里维护状态,Compose自动重组UI。写起来很舒服,但要注意一点:别把ViewModel搞得太重。我见过有人把网络请求、数据库操作全塞ViewModel里,那跟MVC的Activity有啥区别?
避坑指南:我曾经在ViewModel里直接调用Repository,结果单元测试时发现依赖太多,Mock起来特别痛苦。后来我改用UseCase层,把业务逻辑抽出来,测试就轻松多了。
四、MVI:单向数据流的极致
MVI,Model-View-Intent。它把用户操作抽象成Intent,状态集中管理,数据流单向流动。说白了,就是让状态变化变得可预测、可追踪。
为什么需要MVI?MVVM虽然好,但多个数据源同时更新时,状态容易不一致。比如一个页面同时加载用户信息和商品列表,两个LiveData各自更新,UI可能处于中间状态。MVI用一个State对象统一管理,所有变化都经过Reducer处理,状态变化一目了然。
MVI的核心要素:
- Intent:用户操作的抽象,比如点击、滑动
- State:单一不可变的状态对象
- Reducer:根据Intent生成新State的纯函数
- Effect:副作用,比如导航、弹Toast
你想想看,一个页面只有一个State对象,所有UI都根据这个State渲染。用户点击按钮 -> 发出Intent -> Reducer生成新State -> UI自动更新。整个过程是单向的,不会出现“你改我改大家改”的混乱局面。
我的经验:MVI特别适合复杂交互页面,比如表单、多步骤流程。我做过一个电商下单页面,用了MVI后,状态管理清晰多了。以前用MVVM时,经常出现“提交按钮状态和表单数据不同步”的bug,换成MVI后一次都没出过。
五、架构演进的驱动力
说了这么多,你可能会问:为什么架构一直在变?
核心驱动力就两个:
- 复杂度上升:App功能越来越多,页面交互越来越复杂。MVC那套根本扛不住。
- 测试需求:现代开发要求高覆盖率、自动化测试。架构必须支持单元测试和UI测试。
说白了,架构演进就是为了让代码更好写、更好测、更好改。没有银弹,只有适合当前场景的方案。
六、如何选择?
我建议你根据项目情况来选:
| 项目类型 | 推荐架构 | 理由 |
|---|---|---|
| 小型工具类App | MVVM | 简单够用,开发快 |
| 中型业务App | MVVM + UseCase | 解耦清晰,测试方便 |
| 大型复杂App | MVI | 状态可控,适合多人协作 |
| 团队新手多 | MVP | 容易理解,上手快 |
注意:别为了用架构而用架构。我见过有人在小项目里硬上MVI,结果代码量翻倍,开发效率反而下降了。架构是工具,不是目的。
七、总结
从MVC到MVI,本质上是控制权的转移:从View控制一切,到数据驱动UI,再到状态集中管理。每一步都是为了解决前一步的问题。
我个人觉得,没有最好的架构,只有最合适的架构。你可以在一个项目里混合使用,比如简单页面用MVVM,复杂页面用MVI。关键是团队达成共识,保持一致性。
嗯,今天就聊到这儿。下一章咱们深入MVVM,聊聊ViewModel和LiveData的那些坑。到时候我会分享一些实战经验,保证让你少走弯路。
一句话总结:架构演进不是为了炫技,而是为了让代码更可控、更可测、更可维护。选对架构,事半功倍;选错架构,事倍功半。