首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

「架构篇 2」认识 MVC / MVP / MVVM / MVI

  • 25-04-24 19:21
  • 3000
  • 7964
juejin.cn

前言

接本系列第一篇文章 「架构篇 1」认识 MVC / MVP / MVVM / MVI,建议大家读完再看这里。

学习 MVI 的话,强调意图,强调流。有一种将流用到极致的感觉,所以如果不能灵活运用 Flow 相关 API 的话,会较吃力,建议先学习 Flow,可以用下面 2 篇文章扫盲:

  • Flow/StateFlow/SharedFlow 正确使用姿势
  • 关于 MutableSharedFlow 的 tryEmit 和 emit 争议说法

MVI

先说一点,Google 目前从未在 Android Developers 中提及 MVI,但是 MVI(Model-View-Intent)这一架构模式在 Android 开发中很流行,主要是因为 MVI 的理念(单向数据流、不可变状态)和 Google 推出的现代应用架构一致。 MVI 与 MVP/MVVM 不是非此即彼的关系,它们是不同维度的。

从界面发出的数据叫Intent,而界面接收的数据叫State,这样整个界面的刷新流程就形成一条Unidirectional Data Flow(UDF),即单向数据流。

MVI 关心的不是具体的界面状态持有者,而是整个更新界面数据链路的流动方式和方向。

在 MVI 中,把界面的一次展示理解为单个 State 的一次渲染。相较于 MVVM 中一个界面可能被分拆为多个 LiveData,State 这种唯一数据源降低了复杂度,使得代码容易维护。

界面层

使用名为 XUiState 的data class,来定义界面状态,且类中的属性皆是 val 的,以此来保证单一数据源,

image.png

kotlin
代码解读
复制代码
//在viewmodel 定义如下 uiState private val _bgmEntranceUiState = MutableStateFlow(null) val bgmEntranceUiState: StateFlow = _bgmEntranceUiState //在fragment接收此flow fun initObser(){ launchCoroutine { bgmEntranceUiState.collect { //处理页面中某一个部分的 1组view,在这个模式之前使用MVVM, //这1组view 需要接受多个 livedata的 observer,当发现问题时, //无法快速确定哪个数据源导致的变化 } } }

image.png

这个图中可以观察一下,状态向下流动、事件向上流动的这种模式称为单向数据流 (UDF)。

界面层包含与界面相关的状态和界面逻辑,相应的数据和业务逻辑是放到数据层。

数据层

image.png

这里 ViewModel 持有 Repository 引用,推荐使用 依赖项注入模式并使用 Hilt 库

网域层

image.png

image.png

最终架构模型

image.png

我负责的歌房/直播业务,目前没有网域层,其余按照官方推荐架构已经重构过,其实推荐大家按照上面的官方文档链接读完,再看看 nowinandroid 项目,结构清晰易阅读,也更容易理解了。

写完感触

其实上班这么长时间来,回头一看:
第一家公司没有架构可言,主打就是完成功能;
第二家公司MVC,后期就是 Activity 超级大;
第三家公司就是 MVP,那时候感觉最深的就是每次新起一个模块一堆模版代码;
目前这家公司,我负责歌房/直播业务,除 C++ 层接触不多,其余 TRTC 模块,美颜模块,性能优化模块都有所触及,随着业务越来越复杂「公认复杂」,最初 MVVM 明显感觉到修改业务的复杂度变得很高,然后重构到现在的 MVI,歌房/直播里有新增业务模块,基本很少改动到原有的业务代码,各个业务解偶,目前比较满意「但还有很多老业务冗余在 Activity/Fragment/ViewModel 中,哈哈哈... 目前原则就是 不动就不会有大bug」有心情的话,接下来会把歌房的架构画一画,拿出去面试也能够清晰了然。

接下来的计划就是重点看 C 这块,把演唱底层 系统学完。

参考链接

ViewModel

注:本文转载自juejin.cn的张力尹的文章"https://juejin.cn/post/7496345177129582646"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

140
Android
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2024 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top