【Android 架构】MVC/MVP/MVVM/MVI架构

手把手教你搭建 Android MVI架构: MVI + kotlin + Flow Android MVI是一种用于构建Android应用程序的架构模式,其核心思想在于实现单向数据流和唯一可信数据源。在MVI架构中,应用程序的状态管理得到简化,并且用户界面与业务逻辑之间的交互更加清晰和规范。UIState。 阅读详情


目标:描述清楚数据流向,MVC/MVP的弊端,MVVM,MVI的差异

  • 所谓的MVVM是双向数据流,MVI是单向数据流。其实是基于MVVM用了DataBinding,将ViewModel数据绑定到xml中。解耦了这一层,本质也是单向数据
  • 以登录为例,比如登录后有成功/失败/网络异常等,MVVM框架写多个livedata(其实也可以写一个loginresult)去监听,而对于MVI就全部封装在一个State类里。

MVI 中 View 不会直接赋值给 ViewModel,View 只发送 Intent,所有状态变更都由 ViewModel 内部基于 Intent 来产生,UI 只负责订阅 State 渲染。

而普通 MVVM 架构本身没有强制约束,语法上 View 可以直接修改 ViewModel 内部 MutableLiveData;虽然好的工程实践会避免这种写法,但这只是团队规范,不是架构强制。所以 MVVM 可以做到单向,但做不到 MVI 那种强约束的单向闭环。

1.MVC(Model‑View‑Controller)

架构角色

  • Model:数据层,业务实体、网络、数据库,负责数据获取与存储
  • View:视图,Activity / XML,负责 UI 渲染、接收用户交互
  • Controller:控制器,Android 原生没有独立 Controller 类,由 Activity 兼任,接收 View 事件,调用 Model,拿到结果再驱动 View 刷新

架构简易关系

View ↔ Controller ↔ Model

Android 原生 MVC 最大问题:Activity 既做 View 又做 Controller,大量业务逻辑写在 Activity,页面越来越重,视图和控制器强耦合。

优点

  1. 简单直观,上手成本低,原生 Android 天然支持
  2. Model 完全独立,可复用

缺点

  1. Activity 职责过载,巨型 Activity,单元测试困难
  2. View 持有 Controller,Controller 又持有 View,双向耦合
  3. View 强依赖 Android 框架,难以脱离设备做单元测试

适用场景:小型简单页面、Demo、老项目维护。

2.MVP(Model‑View‑Presenter)

核心目标:解耦 Activity,把业务逻辑抽离到 Presenter
架构角色

  • Model:数据层,不变
  • View:接口,由 Activity/Fragment 实现 View 接口,只做 UI 操作
  • Presenter:中间人,持有 View 接口引用 ,处理业务逻辑,调用 Model,回调更新 View

架构简易关系

View <--> Presenter <--> Model
View只通过接口和Presenter交互

优点

  1. Activity/Fragment 轻量化,只负责 UI;业务全部下沉 Presenter
  2. View 抽象成接口,Presenter 不依赖 Android SDK,可做纯 JVM 单元测试
  3. 职责清晰,适合中等复杂度业务

缺点

  1. 接口爆炸:每一个页面要定义一套 View 接口,模板代码多
  2. 内存泄漏风险:Presenter 持有 View 引用,页面销毁忘记置空会泄漏 Activity
  3. 单向数据流不彻底,容易出现 Presenter 直接操作 View、状态分散
  4. 状态需要自己维护,配置变更(屏幕旋转)需要手动保存恢复

适用场景:中大型传统业务页面,老项目重构;现在新项目逐步被 MVVM/MVI 替代。

3.MVVM(Model‑View‑ViewModel)

核心:数据驱动 UI,观察者模式,消除 Presenter,ViewModel 持有可观察数据,View 订阅数据变化自动刷新
架构角色

  • Model:数据层
  • View:Activity/Fragment,只负责观察数据、事件转发
  • ViewModel:保存页面状态、业务逻辑,提供 LiveData/StateFlow 可观察数据;不持有 View 引用

架构简易关系

View(订阅) ← ViewModel ← Model
View的事件单向传入ViewModel

优点

  1. ViewModel 不持有 View 引用,从根源规避 MVP 的内存泄漏
  2. 数据驱动 UI,UI 跟随数据自动更新,减少大量手动调用 View 的模板代码
  3. 屏幕旋转配置变更,ViewModel 自动保留状态
  4. Jetpack 原生支持,Android 官方主推

缺点

  1. 状态分散:多个 LiveData/StateFlow,页面状态散落在多个变量,状态一致性维护成本高
  2. 调试难度上升:数据变化链路间接,不容易追踪状态变更来源
  3. LiveData 有生命周期感知,但只能在主线程分发;复杂页面容易出现多源数据冲突(例如 MediatorLiveData 踩坑)

适用场景:绝大多数现代 Android 业务,大部分 App 主流选型。

4.MVI(Model‑View‑Intent)

注意:MVI 里的 Intent 不是 Android 组件 Intent,代表用户意图;核心:单向数据流、单一数据源、不可变状态
架构角色

  • Model:业务数据
  • View:只做两件事:发送用户意图、渲染页面状态
  • ViewModel:接收 View 发送的 Intent,执行业务,输出唯一的 UiState(不可变数据类)给 View;View 只渲染这个 UiState

架构简易关系

View → Intent → ViewModel → UiState → View
单向闭环数据流

优点

  1. 单一 UiState,页面所有状态收敛到一个数据类,状态可回溯,适合复杂交互页面
  2. 单向数据流,逻辑可预测,易于复现 bug、便于单元测试
  3. 天然适配协程 + StateFlow,适合 AI 对话、流式输出、富交互这类复杂状态场景

缺点

  1. 模板代码量大,每个页面要定义 Intent、UiState、Event,代码量显著上涨
  2. 不可变对象频繁复制,对象创建开销;简单页面会过度设计
  3. 一次性事件(Toast、弹窗)处理麻烦,需要额外封装 Event 包装类,容易踩坑

适用场景:复杂交互页面:AI 对话、表单多状态、长列表复杂业务;中台模块;项目团队统一规范、强质量要求项目。

在这里插入图片描述

面试加分表述(字节 5 年视角)

  1. 没有绝对最优架构,看业务复杂度和团队;简单页面强行上 MVI 属于过度设计。
  2. MVP 最大痛点是 View 接口爆炸、内存泄漏;MVVM 要警惕状态碎片化;MVI 最大坑是一次性事件处理、对象开销。
  3. 我实际项目中,普通业务页用 MVVM;AI 助手这种多状态、流式输出的复杂模块,采用 MVI 单向数据流做状态收敛。

文字版架构图

  1. MVC
    用户操作 → View → Controller (Activity) → Model;Model 返回数据直接回写 View;View 和 Controller 互相持有。
  2. MVP
    View (Activity 实现 View 接口) ↔ Presenter → Model;Presenter 通过 View 接口回调 UI,Presenter 持有 View 接口。
  3. MVVM
    View 订阅 ViewModel 的 LiveData/StateFlow;View 事件回调给 ViewModel;ViewModel 调用 Model,输出可观察数据,ViewModel 不持有 View。
  4. MVIView发出Intent → ViewModel处理Intent调用Model → 生成唯一不可变UiState → View渲染UiState,完整单向闭环。

补充理解MVI的side-effect

1. Side-Effect 核心定义

  1. 在 MVI 单向数据流架构中,所有页面输出分为两类:可持久化 UI 状态(UiState)与一次性副作用(Side-Effect)。
  2. Side-Effect(副作用):指业务执行过程中产生的单次消费、不可重放、不持久化的页面行为,该行为不参与页面 UI
    渲染,仅用于完成单次交互动作,消费完成后立即失效,不保留任何状态记录。
    在这里插入图片描述

2. Side-Effect 产生的根本原因

2.1 架构层面根源:单一 UiState 的局限性

MVI 核心规范是单一数据源、UI 唯一由 UiState 驱动,但页面业务无法只靠「静态渲染状态」完成,必然存在大量「动态单次行为」。
如果所有业务输出全部塞入 UiState,会导致状态与行为混淆,引发系统性 Bug。

2.2 技术层面根源:StateFlow 可重放特性

Jetpack 官方 ViewModel 生命周期机制 + StateFlow 特性:

  • ViewModel 独立于页面生命周期,屏幕旋转、Fragment 重建不会销毁 ViewModel
  • StateFlow 默认缓存最新值,页面重连订阅时会自动回放最新状态
    若将一次性行为存入 UiState(StateFlow),页面重建后会重复回放旧的行为事件,造成 Toast 重复弹出、页面重复跳转等严重交互 Bug。
2.3 业务层面根源:状态与行为的本质冲突
  • UiState 是「结果」:是页面的静态快照,允许重复渲染,幂等性强
  • Side-Effect 是「动作」:是业务的动态过程,不允许重复执行,无幂等性

处理方案

使用 SharedFlow 或 Channel 来处理一次性事件(如导航、Toast)

SharedFlow

定义effect密封类,通过监听MutableSharedFlow处理

// 1. 定义副作用
sealed interface HomeEffect {
    data class Toast(val msg: String) : HomeEffect
    data class Navigate(val route: String) : HomeEffect
    object ScrollBottom : HomeEffect
}

// 2. ViewModel
class HomeViewModel : ViewModel() {

    private val _effect = MutableSharedFlow<HomeEffect>(
        replay = 0,
        extraBufferCapacity = 3,
        onBufferOverflow = BufferOverflow.DROP_OLDEST
    )
    val effect: SharedFlow<HomeEffect> = _effect

    fun submit() {
        viewModelScope.launch {
            runCatching { repo.submit() }
                .onSuccess { _effect.tryEmit(HomeEffect.Navigate("detail")) }
                .onFailure { _effect.tryEmit(HomeEffect.Toast("提交失败")) }
        }
    }
}

// 3. Fragment 收集
viewLifecycleOwner.lifecycleScope.launch {
    viewLifecycleOwner.repeatOnLifecycle(STARTED) {
        viewModel.effect.collect { e ->
            when (e) {
                is HomeEffect.Toast -> toast(e.msg)
                is HomeEffect.Navigate -> nav(e.route)
                HomeEffect.ScrollBottom -> rv.scrollToEnd()
            }
        }
    }
}

  • 补充SharedFlow的参数

StateFlow 用来存页面 UI 状态,自带最新值、自动去重;SharedFlow 用来发一次性事件,配 replay=0 就不带黏性,不会页面重建重复弹 Toast。两者都是热流。

val sharedFlow = MutableSharedFlow<String>(
    replay = 0,          // 新订阅者,回放多少条历史数据
    extraBufferCapacity = 0, // 额外缓冲区大小
    onBufferOverflow = BufferOverflow.SUSPEND // 缓冲区满了的策略
)
Channel

Channel 主要用于消息不允许丢失、需要背压控制的场景,例如 IM 消息、设备硬件事件、底层推送。send 是挂起函数,生产者可以等待消费者处理完成。
对于普通 UI 的 Side‑Effect,比如 Toast、页面跳转,不建议使用 Channel,容易发生协程阻塞、关闭异常,优先采用replay=0的 SharedFlow。

// 1.定义副作用密封类
sealed class DeviceSideEffect {
    // 设备离线事件,不能丢失
    object DeviceDisconnect : DeviceSideEffect()
    data class ShowImportantAlert(val msg: String) : DeviceSideEffect()
    object NavigateToDeviceSetting : DeviceSideEffect()
}

class DeviceViewModel : ViewModel() {
    /**
     * Channel.UNLIMITED:队列无上限,事件不会丢失
     * 注意UNLIMITED风险:事件疯狂涌入会持续占用内存
     * 普通业务可选用 Channel.BUFFERED 设置固定缓冲区
     */
    private val _sideEffectChannel = Channel<DeviceSideEffect>(Channel.UNLIMITED)
    // 转为Flow对外暴露,只读
    val sideEffectFlow = _sideEffectChannel.receiveAsFlow()

    fun handleDeviceStatusChange() {
        viewModelScope.launch {
            // 底层设备回调,重要事件不能丢失
            _sideEffectChannel.send(DeviceSideEffect.DeviceDisconnect)
        }
    }

    override fun onCleared() {
        super.onCleared()
        // ViewModel销毁,必须关闭Channel,防止继续发送抛出异常
        _sideEffectChannel.close()
    }
}

技术选型对比

为啥绝大多数场景选SharedFlow

  1. Channel(信箱):
    你往信箱塞消息 (send),如果对面(Fragment)不在家(APP 退后台、页面不可见),信箱满了,塞快递这个动作就卡住不动了,后面你的业务代码全部被卡住等待。
    页面后台驻留时 send 会阻塞生产者协程

send 是挂起函数:消费者没接收,生产者就原地等着。

适合场景:重要消息丢不起,愿意等对方接收,比如设备断开、IM 消息。

  1. 普通 UI 副作用(Toast、跳转、滚动)是什么?
    用户退到后台,这个 Toast 本来就没必要弹。
    如果用 Channel,页面退后台,你想弹个 Toast,结果页面没在看,send()直接把 ViewModel 里面的协程卡住,网络、设备业务全部暂停,这就是灾难。

UI 副作用:丢了就丢了,绝不允许把核心业务给卡住。

  1. SharedFlow (replay=0)(广播喇叭):
    用户不在家,我喊一声,没人听就算了,发送动作不会卡住我自己,该干啥继续干。
    刚好匹配 Toast、跳转:后台来了就直接放弃,绝不阻塞主业务。
浅谈Android MVI架构---大自然的搬运工~~~ 浅谈 Android MVI架构 阅读详情

相关推荐

Android MVI 架构学习

这些年来,Android 上发展了多种主流架构,从最开始的MVC,到Clean和MVP,再到现在最火热的MVVM,可以说架构发展一直很卷,这不,MVVM还没有用个几年呢,MVI就出来了。要说 Android 架构卷,实则不然,上面说的这些架构其实根本不是来自 Android 的,而是源自于Web,即大前端, Web 由于其自身特性(还不算完全成熟,业务多且杂,热部署等),版本迭代速度巨快,技术的更新迭代也因此很快,上面这些架构最早就是在前端所应用和发展出来的, 而移动端则是直接抄来,跟着Web的步伐前进。.

RikkaTheWorld 3688

Android 架构 - MVI

命名采用:功能+UiState。界面刷新用到的状态全都定义成子类,集中在一起实现唯一可信数据源。子类不带参数就定义成 object 方便复用(因为创建的实例无状态区别)。一般同 ViewModel 写在同一个 .kt 文件中,也可以单独写在一个 .kt 文件中。

HugMua的博客 5220

Android架构演进:从MVC到MVI,如何根据项目阶段选择合适模式

在软件开发中,架构模式是管理复杂度的核心手段,其本质在于实现关注点分离,提升代码的可维护性和可测试性。从经典的MVC到数据驱动的MVVM,再到强调单向数据流的MVI,每种架构都针对特定的复杂度问题提供了解决方案。其技术价值在于通过清晰的职责划分,降低模块间的耦合度,使团队协作更高效,并为核心业务逻辑的长期演进奠定基础。在实际的Android应用开发场景中,架构选择并非追求时髦,而需精准匹配项目阶段——初创期追求灵活高效,成长期侧重可测试性与团队规范,成熟期则需高度解耦与领域独立。本文聚焦于Android架构

weixin_30599769的博客 457

Android应用开发架构之MVI:原理、流程与实战指南

在现代的Android应用开发中,构建可维护、可扩展且具备响应式特性的架构变得越来越重要。在本文中,我们将介绍一种新颖的架构模式:MVI(Model-View-Intent)。我们将详细讲解MVI架构的原理和流程,并通过具体的代码示例进行实战演示。同时,我们还会分享一些在实际工作中的经验和解决的问题。此外,我们将与MVVM和MVP架构进行对比,探讨MVI架构的优点和如何弥补其缺点。MVI架构通过响应式数据流和单向数据流的特性,提供了一种可维护、可测试且具备响应式特性的架构模式。

大模型训练 3978

Apifox 自动化测试新增流程控制条件,复杂测试场景不再是问题

在 if 条件后的输入框填写请求接口得到的变量 viewed ,选择条件为「小于」,输入比较数值 10 ,并在 if 条件下添加「宠物下架处理」步骤。借助新增的自动化测试流程控制条件,测试人员就可以使用 Apifox 去实现更深层更多样的测试应用场景,帮助提升测试效率,减少复杂场景的测试操作。「查询新建宠物」、「修改宠物状态为已售出」和「查询宠物状态是否修改」步骤为当前在售宠物信息盘点的三个标准步骤,所以将这三个步骤合成一组。在循环中添加「查询在售宠物」和「修改宠物状态」步骤;

877

Windows——Nessus安装(无限制)

Nessus手把手图文安装,解除ip限制~

网安小白的博客 9448

android MVC/MVP/MVVM/MVI架构发展历程和编写范式

本文对比了MVC,MVP,MVVM,MVI架构在android上的发展历程和实现的代码开发范例。文章指出架构本质是思想而非教条,开发者应重点把握数据驱动、单一数据流等核心原则,而非严格遵循某种模式。随着Jetpack组件的出现,现代Android开发已融合了MVVM和MVI的影子,形成了更灵活的开发范式。

jzlhll123的专栏 975

基于ESP32与PCM5102的WiFi无损音频传输系统设计与实现

本文详细介绍基于ESP32与PCM5102的WiFi无损音频传输系统设计与实现。通过I2S接口直接传输PCM数据,避免SRC重采样,实现真正的HIFI级音质。涵盖硬件连接、软件架构、网络传输优化及实际音质对比,为音频爱好者提供高性价比的无损无线音频解决方案。

rnn9storyteller的博客 948

Android/iOS移动架构选型指南:MVC、MVP、MVVM与MVI实战对比

移动应用架构本质上是应对响应速度、可测性、协作成本与调试效率等工程挑战的系统性解法。从基础的MVC职责粘连问题,到MVP通过接口隔离实现可测试性突破,再到MVVM借助数据绑定解耦UI与逻辑、提升UI迭代效率,最终演进至MVI以不可变State和显式Intent保障强一致性——这一演进路径并非技术升级竞赛,而是由真实业务场景(如医疗IoT状态管理、金融交易确定性)倒逼出的工程收敛。尤其在跨端开发(KMM/Compose/SwiftUI)和高可靠性场景中,MVI的单向数据流与副作用分离机制展现出独特价值;而MV

weixin_30691649的博客 51

27930-2015+充电协议解析

对2015+充电与2015充电进行硬件电路对比、通信协议对比和2015+通信协议解析。

manjixingkong1234的专栏 233

从 CDS 接口到 ABAP 运行时,深入理解 SAP RAP Custom Entity

CDS Custom Entity 是一种非 SQL、瞬态的 CDS 实体,不依赖 HANA SQL 读取数据,而是通过 ABAP 类实现查询逻辑(如 RFC、OData、BAPI 等)。它在 CDS 层定义数据契约(字段、键、关联、注解),由 @ObjectModel.query.implementedBy 指向实现 IF_RAP_QUERY_PROVIDER~SELECT 的类,真正执行数据获取。适用于无法用 SQL 表达的数据源,如远程系统或 API。其核心是“接口 + 实现”模式,运行时由 RAP

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 170

Android MVC, MVP, MVVM, MVI 架构

MVC 架构主要分为以下几个部分:请求的流程:存在问题:MVP的构成:流程:相较于MVC:仍然存在的缺点: 模式将 改名为 ,基本上与 模式完全一致。 唯一的区别是,它采用双向数据绑定():的变动,自动反映在 ,反之亦然同时将代码划分为三个部分:流程: 与 很相似,其借鉴了前端框架的思想,更加强调数据的单向流动和唯一数据源。![[Pasted image 20260424011110.png]]分为三个部分:MVI强调数据的单向流动,主要分为以下几步:用户操作以Intent的形式通知ModelMode

Co_Hui的博客 304

YOLOv11改进策略【独家融合改进】| 模型轻量化二次改进:StarNet + FreqFusion,极限降参,适用专栏内所有轻量化模型

FreqFusion是一种旨在解决密集图像预测任务中特征融合问题。

Limiiiing的博客 2123

架构模式MVC_MVP_MVVM_MVI详解_优快云

没有架构的代码就像没有图纸盖房子——功能也许能跑,但改一个地方崩三处新同事看一周不敢动单元测试无从下手。分离关注点(Separation of Concerns)。把"数据怎么来"、“界面怎么画”、"逻辑怎么算"拆开,各管各的。💡 本文将从历史演进的角度,逐一拆解 MVC → MVP → MVVM → MVI 四种模式,每种都配有完整的 Kotlin 代码示例和实际项目中的最佳实践。// LoginContract.kt —— 定义 View 和 Presenter 的交互协议。

BinHuanghai的博客 439

【蒸汽幻想台服新版商业端】2025最新整理单机一键即玩镜像端+WIN系半手工端+PC客户端+网页注册+网页管理后台+教程【站长亲测】

MMORPG端游【蒸汽幻想台服新版商业端】2025最新整理单机一键即玩镜像端+WIN系半手工端+PC客户端+网页注册+网页管理后台+教程。

百创科技 531

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

MVC、MVP、MVVM、MVI 的区别与实现原理

系统讲解 MVC、MVP、MVVM、MVI 各组成部分的职责、实现原理、数据流、优缺点、测试方式,以及它们如何与 Clean Architecture 组合

trebleZ的博客 849

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Android架构新手看这里:TheContext-Podcast中MVC、MVVM到MVI的完整学习路线

TheContext-Podcast 是一档专注 Android 开发的播客,由三位一线工程师主持,邀请 Square、Airbnb、SoundCloud 等公司嘉宾,系统讲解了 **MVC、MVVM、MVP、MVI** 等 Android 架构的核心区别与落地方法。对于刚接触 Android 架构的开发者来说,跟着这部剧集走一遍,就能建立完整的 Android 架构知识体系。 [![TheCo

gitblog_00004的博客 478

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

详细解析 MVC/MVP/MVVM/MVI 架构

在 Android 开发中,架构设计的核心目标始终是解耦代码、提升可维护性、降低测试成本,而从最初的 MVC 到如今主流的 MVVM、MVI,每一种架构的诞生都是为了解决前一种架构在实际开发中暴露的痛点。我们下面从核心定义、角色分工、优缺点三个维度全面解析 MVC、MVP、MVVM、MVI 四种架构的区别,并用同一个极简业务场景实现四种架构的核心代码,所有示例基于 Kotlin 编写。

. 1780

Android 架构演进实战:MVC → MVP → MVVM → MVI

本文以同一款天气 App 为例,用 Kotlin + 传统 XML 对比 MVC、MVP、MVVM、MVI 四种 Android 架构。MVC 把逻辑与界面混在 Activity;MVP 借接口解耦、逻辑可单测;MVVM 以 StateFlow 驱动、旋转不丢状态;MVI 进一步将状态收敛为唯一来源。四套代码共用同一数据层,直观体会状态从哪来、往哪去。

ITMonkeyKing的博客 341

MV*系列架构模型

浅谈对 MVC、MVP、MVVM、MVI 的理解

主营Android,副营Flutter、前端 878

Android架构演进与落地:从MVC到MVVM与MVI的工程实践

架构设计是应对业务复杂度增长的核心手段,其本质在于分层解耦,让UI、业务逻辑与数据源彼此独立,进而提升可测试性与可维护性。在Android平台,架构模式经历了从MVC的Activity大泥球,到MVP的接口爆炸,再到Jetpack MVVM标准化,以及MVI单向数据流与协程异步化的演进。合理的架构并非越新越好,而是需要匹配业务规模:小体积项目可采用轻量MVVM,中大型项目则宜结合模块化与依赖注入,确保团队规范和状态一致性。本文结合工程实践,解析现代Android分层架构(UI层、Domain层、Data层)

weixin_28040125的博客 187

【Android面试】架构模式专题

Android架构模式

studyForMokey的博客 466

从 MVC 到 MVI:Android 架构到底在解决什么问题?

怎么把"逻辑"和"界面"分开,怎么让"状态"变得可控。MVC分得不彻底,MVP分得太生硬,MVVM靠数据驱动实现了自动解耦,MVI用单向数据流把状态管理做到了极致。架构演进的本质,是从"人能管住代码"到"代码自己管住自己"。

2401_83326930的博客 227

Kotlin多平台最佳架构指南

在 Kotlin Multiplatform Mobile 中,市场上有多种架构库,用于解决 KMM 中存在的多种问题。在 2023 年,Circuit 架构、BLoC 架构、Decompose 架构等都将推出,当前存在着大量的架构库。但我们是否应该使用这些架构?一个架构不应该依赖于任何带来维护问题的架构库。我宁愿考虑使用简单而干净的 MVVM 架构,它可以轻松扩展,并对未来的修改开放,而不依赖于任何其他的 API 或库。

虎哥LoveDroid 793

Android架构演进实战:从MVC到MVVM与MVI状态管理之路

在移动应用开发中,架构设计是应对业务复杂度与团队协作挑战的核心基础设施。从早期MVC中Activity职责混乱,到MVP分离界面与业务,再到MVVM借力Jetpack实现数据驱动,每一次架构演进都围绕状态管理、依赖解耦与可测试性展开。如今MVI以单向数据流和不可变State进一步提升界面状态的确定性,成为复杂业务场景的优选方案。本文从工程痛点出发,梳理Android架构演进脉络,结合ViewModel、LiveData、StateFlow、协程等关键技术,对比各模式优劣势,给出新项目选型、分层设计及常见坑的

weixin_29017445的博客 324
上一篇: 【Android Kotlin】协程知识体系
下一篇: 【Android 内存管理】JVM 内存模型与 GC 原理
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值