Android MVI架构的深入解析与对比
什么是MVI?
M:model,此处的model并不是传统的数据模块,它是指用来存储视图状态UI State的一个模块 。比如请求数据时的loading、请求失败的提示页面等UI层面的变化状态。
V:view,视图模块
I:intent,此处的intent并非是我们页面跳转的intent,而是取起实际意思:意图、目的。用来响应用户在操作屏幕时的动作,用户的意图和目的。比如点击保存按钮或者下拉刷新数据等。
MVI、MVVM和MVP架构的对比
MVI、MVVM和MVP都是常见的Android架构模式,各自有其优点和适用场景。
MVI -VS- MVVM:
MVI的数据流是单向的,状态变化由模型(Model)驱动,确保了状态的一致性和可预测性。
MVVM中的双向数据绑定可以简化视图(View)和模型(Model)之间的数据交互,但也可能导致状态管理的混乱。
MVI -VS- MVP:
MVI通过响应式数据流实现了对状态变化的高效处理,相比之下,MVP中的视图(View)和模型(Model)之间的交互相对复杂。
MVI的单向数据流使得测试模型(Model)的行为更加容易,而MVP中的视图(View)和模型(Model)之间的耦合可能导致测试困难。
MVI架构实战讲解和代码示例
为了更好地理解MVI架构,让我们通过一个例子进行实战演示。我们将创建一个天气预报应用,展示当前天气和未来几天的天气预报信息。
在代码示例中,我们会用到以下库:
RxJava:用于处理响应式数据流。
LiveData:用于将数据流连接到视图。
首先,我们定义模型(Model)的状态(State)类,包含天气预报的相关信息,例如温度、湿度和天气状况等。
data class WeatherState(val temperature: Float,val humidity: Float,val condition: String
)
接下来,我们创建视图(View)界面,展示天气信息,并提供一个按钮用于刷新数据。
class WeatherActivity : AppCompatActivity() {// 初始化ViewModelprivate val viewModel: WeatherViewModel by viewModels()override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_weather)// 监听状态变化,更新UIviewModel.weatherState.observe(this, Observer { state ->// 更新温度、湿度和天气状况的显示temperatureTextView.text = state.temperature.toString()humidityTextView.text = state.humidity.toString()conditionTextView.text = state.condition})// 刷新按钮点击事件refreshButton.setOnClickListener {// 发送刷新数据的意图viewModel.processIntent(RefreshIntent)}}
}
然后,我们创建意图(Intent)类,代表用户操作的动作。在这个例子中,我们只有一个刷新数据的意图。
object RefreshIntent : WeatherIntent
接下来,我们实现模型(Model)部分,包括状态管理和数据流的处理。
class WeatherViewModel : ViewModel() {// 状态管理private val _weatherState = MutableLiveData<WeatherState>()val weatherState: LiveData<WeatherState> = _weatherState// 处理意图fun processIntent(intent: WeatherIntent) {when (intent) {RefreshIntent -> fetchWeatherData()}}// 获取天气数据private fun fetchWeatherData() {// 发起网络请求或其他数据获取逻辑// 更新状态val weatherData = // 获取的天气数据val newState = WeatherState(temperature = weatherData.temperature,humidity = weatherData.humidity,condition = weatherData.condition)_weatherState.value = newState}
}
本文讲解了在Android开发中的MVI架构的简单解析理解,以及对比MVVM和MVP架构;更多有关Android程序员的架构技术进阶,可以参考《Android架构核心技术手册》点击可以查看详细类目详情。
相关文章:

Android MVI架构的深入解析与对比
什么是MVI? M:model,此处的model并不是传统的数据模块,它是指用来存储视图状态UI State的一个模块 。比如请求数据时的loading、请求失败的提示页面等UI层面的变化状态。 V:view,视图模块 I:…...
达梦数据库表空间管理常用SQL
达梦数据库表空间管理常用SQL 表空间容量分析表空间创建与扩容 查看数据库状态: select name,instance_name,status$,mode$ from v$instance; --mode$显示Primary为主库select name,status$,role$ from v$database; --status$:1 启动,2 启动…...

Flutter 组件集录 | InheritedNotifier 内置状态管理组件
theme: cyanosis 1. 前言 在上一篇 《Flutter 知识集锦 | 监听与通知 ChangeNotifier》 中,我们介绍了 ChangeNotifier 对象通知监听者的能力。并通过一个简单的模拟下载进度案例,介绍了它的使用方式: | 案例演示 | 监听-通知关系 | | --- | …...

NOIP2023模拟10联测31 涂鸦
题目大意 有一面由 n m n\times m nm个格子组成的墙,每个格子要么是黑色,要么是白色。你每次将会进行这样的操作:等概率随机选择一个位置 ( x , y ) (x,y) (x,y)和一个颜色 c c c(黑色或白色),࿰…...

【Python基础知识一】基本语法、常用数据类型等
Python基础知识: 1 标识符(Identifier)2 关键字/保留字(Keyword)3 引号4 编码5 输入输出6 行与缩进7 多行语句8 注释9 数据类型9.1 数字(Number)类型9.2 变量(variate)9.3 字符串(St…...

听听ChatGPT对IT行业的发展和就业前景的看法
🌈个人主页: Aileen_0v0🔥系列专栏:PYTHON学习系列专栏💫"没有罗马,那就自己创造罗马~" 目录 (1)判断素数 写法1: 写法2: (2)计算1-100的偶数之和 写法1: 写法2: (3)计算1-100的奇数之和 (4)多层循环 IT行业哪个方向比较…...
〖程序员的自我修养 - 认知剖析篇⑤〗- 选择前端还是后端?
人之所以会觉得迷茫,本质上是欠缺对自己的一个控制力、识别庞杂信息、去伪存真的独立思考与认知能力。 说明:该文属于 程序员的自我修养 专栏,购买任意白宝书体系化专栏可加入易编程社区,早鸟价订阅模式除外。福利:加入社区的小伙伴们,除了可以获取博主所有付费专栏的阅读…...
Rust语言初步
文章目录 安装与测试变量条件语句和函数数组和元组循环 安装与测试 可以从官网直接下载。下载rustup-init并运行之后,会打开命令行,选1默认安装,然后不出意外就安装完了。 安装完成后按照惯例查看一下版本,如不报错就算成功。 …...
BIMILLC算法源码解析
论文链接:https://arxiv.org/abs/1607.02533 源码出处:https://github.com/Harry24k/adversarial-attacks-pytorch/tree/master 源码 import torch import torch.nn as nnfrom ..attack import Attackclass BIM(Attack):r"""BIM or iter…...
Android STR研究之五
前言: 在前四篇中初步介绍了开机流程,STR流程,唤醒流程,这里讲下STR的问题点 Android STR研究之一-CSDN博客 Android STR研究之二-CSDN博客 Android STR研究之三-CSDN博客 Android STR研究之四-CSDN博客 问题1:进入STR…...

python3+requests接口自动化测试实例详细操作
前段时间由于公司测试方向的转型,由原来的web页面功能测试转变成接口测试,之前大多都是手工进行,利用postman和jmeter进行的接口测试,后来,组内有人讲原先web自动化的测试框架移驾成接口的自动化框架,使用的…...

在Node.js中,什么是中间件(middleware)?它们的作用是什么?
聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 欢迎来到前端入门之旅!感兴趣的可以订阅本专栏哦!这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…...

当函数参数为一级指针,二级指针
当函数参数为一级指针,二级指针 在讲述内容之前,先讲四点重要知识 1.当传入参数时,函数形参会立即申请形参的内存空间,函数执行完毕后,形参的内存空间立即释放掉。 1.指针是存放其他变量地址的变量。指针有自己的内…...

Hydra post登录框爆破
文章目录 无token时的Hydra post登录框爆破带Token时的Hydra post登录框爆破 无token时的Hydra post登录框爆破 登录一个无验证码和token的页面,同时抓包拦截 取出发送数据包:usernameadb&password133&submitLogin 将用户名和密码替换 userna…...

阿里云推出AI编程工具“通义灵码“;生成式 AI 入门教程 2
🦉 AI新闻 🚀 阿里云推出AI编程工具"通义灵码",支持多种语言及实时续写功能 摘要:阿里云推出了一款名为"通义灵码"的AI编程工具,支持多种主流编程语言,包括Java、Python、Go等。该工…...

使用Qt Installer Framework将自己的程序打包成安装包程序
使用Qt Installer Framework将自己的程序打包成安装包程序 制作安装包程序就是将自己的程序打包成一个可执行的exe,双击之后进行安装。 1. 在制作安装包程序之前需要安装qt官方提供的安装包制作工具Qt Installer Framework 去qt官方网址,下载对应的 Q…...

逆袭Flutter? Facebook 发布全新跨平台引擎 Hermes!
Facebook 于前日发布了新的 JavaScript 引擎:Hermes,专注于提高 React Native 应用的性能,并且在市面上那些内存较少、存储速度较慢且计算能力低下的移动设备上都有良好的表现。但是不是为了追赶Flutter?这块作者没有说明。 移动应…...
c++ 互斥锁使用详解 lock_guard
c 互斥锁使用详解 std::mutex 用于保护共享资源,防止多个线程同时修改共享资源而引发竞争条件。 成员函数 lock:锁定互斥,若互斥不可用则阻塞。try_lock:尝试锁定互斥,若互斥不可用则返回。unlock:解锁…...

【快速解决】Android Button页面跳转功能
目录 让我们直接开始 第一步:先建立一个新的activity 编辑 第二步:打开第一个页面的Java文件MainActivity 方法一:直接跳转功能如下: 方法二:输入密码才能进行跳转功能如下: 需要注意的地方 结语 让…...
C语言 pthread_create
备注void *,最好添加返回值 原因:在实践中,虽然你的函数可能不需要返回任何值,但为了与 pthread_create 函数的预期函数指针格式相匹配,最好遵守函数指针所需的返回类型。这是一种良好的编程实践,确保你的代…...

论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)
笔记整理:刘治强,浙江大学硕士生,研究方向为知识图谱表示学习,大语言模型 论文链接:http://arxiv.org/abs/2407.16127 发表会议:ISWC 2024 1. 动机 传统的知识图谱补全(KGC)模型通过…...

04-初识css
一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...
C++.OpenGL (10/64)基础光照(Basic Lighting)
基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...
Element Plus 表单(el-form)中关于正整数输入的校验规则
目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入(联动)2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...
C++.OpenGL (14/64)多光源(Multiple Lights)
多光源(Multiple Lights) 多光源渲染技术概览 #mermaid-svg-3L5e5gGn76TNh7Lq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-3L5e5gGn76TNh7Lq .error-icon{fill:#552222;}#mermaid-svg-3L5e5gGn76TNh7Lq .erro…...

脑机新手指南(七):OpenBCI_GUI:从环境搭建到数据可视化(上)
一、OpenBCI_GUI 项目概述 (一)项目背景与目标 OpenBCI 是一个开源的脑电信号采集硬件平台,其配套的 OpenBCI_GUI 则是专为该硬件设计的图形化界面工具。对于研究人员、开发者和学生而言,首次接触 OpenBCI 设备时,往…...

篇章二 论坛系统——系统设计
目录 2.系统设计 2.1 技术选型 2.2 设计数据库结构 2.2.1 数据库实体 1. 数据库设计 1.1 数据库名: forum db 1.2 表的设计 1.3 编写SQL 2.系统设计 2.1 技术选型 2.2 设计数据库结构 2.2.1 数据库实体 通过需求分析获得概念类并结合业务实现过程中的技术需要&#x…...

对象回调初步研究
_OBJECT_TYPE结构分析 在介绍什么是对象回调前,首先要熟悉下结构 以我们上篇线程回调介绍过的导出的PsProcessType 结构为例,用_OBJECT_TYPE这个结构来解析它,0x80处就是今天要介绍的回调链表,但是先不着急,先把目光…...

Java后端检查空条件查询
通过抛出运行异常:throw new RuntimeException("请输入查询条件!");BranchWarehouseServiceImpl.java // 查询试剂交易(入库/出库)记录Overridepublic List<BranchWarehouseTransactions> queryForReagent(Branch…...

结构化文件管理实战:实现目录自动创建与归类
手动操作容易因疲劳或疏忽导致命名错误、路径混乱等问题,进而引发后续程序异常。使用工具进行标准化操作,能有效降低出错概率。 需要快速整理大量文件的技术用户而言,这款工具提供了一种轻便高效的解决方案。程序体积仅有 156KB,…...