首页 > 其他分享 >跟安卓官网开始学习新的架构模式(MVI)

跟安卓官网开始学习新的架构模式(MVI)

时间:2023-11-07 17:06:35浏览次数:40  
标签:架构 Intent 跟安卓官 UI MVI Model 数据 View

#首先:

大家可以看下官网的简介:

应用架构指南  |  Android 开发者  |  Android Developers (google.cn)

###再说下其他架构模式:

一.mvc

MVC的目的就是为了M和V代码分离,降低耦合性。


Model:数据来源,网络请求数据和数据库数据。

View:对应xml布局文件和动态的布局部分。

Controller:逻辑控制部分。主要起到协调M层和V层的关系,起承上启下的作用。


优点:一定程度上实现了代码分离,降低代码的耦合性。

缺点:

1.Controller和View层难以完全解耦,而且随着业务逻辑增多

2.Controller会变的越来越臃肿。在Android中Activity充当Controller的角色,后面Activity会变成GadActivity。

3. M层和V层还有交互,没有做到完全分离

二.mvp

MVP是在MVC的基础上发展过来的,实现了M层和V层的完全分离,进一步代码解耦。


Model:数据来源,网络请求数据和数据库数据。

View:对应xml布局文件和动态的布局部分。对应Activity。

Presenter:逻辑控制部分。通过接口连接M层和V层。


优点:

1.V层对应Activity,只负责UI的展示和P层直接通信,和M层没有任何交互。

2.V层没有和M层有交互,可以抽成单独的组件,方便复用。

3.代码结构清晰,P层可以用于多个视图,而不需要改变P层的逻辑。

4.V层和M层完全分离,方便协同工作,只需要专注做视图或者逻辑控制部分,不用关系对方的逻辑。比如负责逻辑控制部分不用等设计出图,就可以直接写代码,并进行单元测试。

5.代码复用率高,方便单元测试。

缺点:

1.M层和V层都需要和P层进行通许,会导致P层代码很复杂,而且都是通过接口通讯,如果一个P层用于多个Activity,所有Activity都要实现全部都接口,无论能不能用得到。修改P层接口,往往会涉及到很多个界面,很麻烦。

2.P层和V层通过接口通讯,会持有View的引用,容易造成内存泄露。

3.随着业务增多,P层即使只对应一个视图,接口也会越来越多。

三.mvvm

MVVM在MVP的基础上进一步解耦,VM层不在持有View的引用。

引入响应式编程、Lifecycle生命周期感知、LiveData数据存储、DataBinding数据绑定概念。配合Goole提供的Jetpack组件能节省很多代码。

Model:数据来源,网络请求数据和数据库数据。

View:对应xml布局文件和动态的布局部分。对应Activity。向比较MVP这里的View是通过DataBinding来进行双向绑定数据。

ViewModel:逻辑控制部分。作为桥梁,通知M层处理数据,并将结果回调到V层处理UI。Activity持有ViewModel引用,ViewModel不持有View的引用。

优点:

1.进一步解耦,ViewModel不持有View的引用,当V层改遍,只要V层绑定的数据不变,ViewModel就不需要修改。

2.不需要写很多样板代码,省略findViewById(),Activity变得很简介。

3.通过DataBinding实现View和Model的实时改变,一方改变就会同步到对方。

缺点:

1.DataBinding双向绑定采用异步更新数据,对ListView这样的列表,效率比较低。而且在实际开发中,设计出的Ui效果比较复杂,数据绑定不能完全实现,往往只使用到DataBinding一半的功能,数据更新部分还是手动实现。

2.DataBinding会自动生成大量的代码和属性字段。

3.复杂的页面要定义多个LiveData,并且都要暴露为不可变的LiveData。

4.LiveData是粘性事件,数据倒灌等问题。解决方法:使用第三方 UnPeekLiveData

四.MVI(Model-View-Intent)

出现的目的是为了解决MVVM中双向绑定数据的不足。把双向绑定变成单向数据流。使用Flow代替LiveData存储数据。


Model:这里的Model不是其他框架中的Model层,在MVI框架中表示存储UI的状态。

View:在MVI中View层主要是接口,负责相应UI的状态。

Intent:在MVI中Intent(和Android中的Intent不是同一个)主要负责传递UI状态。使用sealed关键字,形成一个封闭类,类似枚举。主要用于V层通知ViewModel处理数据。

State:和Intent一样是一个封闭类,主要用于ViewModel回调数据修改UI。

##个人理解:

MVI在架构分层上和MVP没有本质区别,但区别主要体现在架构风格和编程思想上。

MVI 是 Model-View-Intent 的缩写,它也是一种响应式 + 流式处理思想的架构。

MVI 的 Model 代表一种可订阅的状态模型的概念,添加了 Intent 概念来代表用户行为,采用单向数据流来控制数据流动和各层依赖关系。

跟安卓官网开始学习新的架构模式(MVI)_MVI

跟安卓官网开始学习新的架构模式(MVI)_逻辑控制_02

  • 在代码的层面上它分为三层:
    UI Layer(界面层) :在屏幕上展示应用界面和数据
    Domian Layer(网域层) :封装复杂或可复用的业务逻辑
    Data Layer(数据层) :获取可公开应用数据和完成业务逻辑


  • MVI 中的单项数据流工作流程如下:
    用户操作以 Intent 的形式通知 Model
    Model 基于 Intent 更新 State
    View 接收到 State 变化刷新 UI


  • MVI - Model-View-Intent
  • MVI是一种响应式和流式的处理思想,将意图事件(用户操作),通过函数转换为特定Model(状态),将其结果反馈给用户(渲染界面)。
  • 抽象下来得到intent(),model(),view() 三个方法
  • intent() 即意图,接收用户的输入(即UI事件,如点击事件)把意图和相关参数封装为数据结构,传递给model()方法。传递意图的接口是统一的,而不像MVP持有Presenter,并调用Presenter的多个接口。
  • model() 不同于一般的model,这里说的model相当于状态模型里的一种状态,model内部的逻辑是不可变的,这能保证状态逻辑的一致性,同时降低系统的复杂性。
  • view() 接收model传来的state渲染UI

跟安卓官网开始学习新的架构模式(MVI)_数据_03

标签:架构,Intent,跟安卓官,UI,MVI,Model,数据,View
From: https://blog.51cto.com/u_16340979/8236871

相关文章

  • 应用架构的演进 | 拒绝牺牲性能为代价的安全
    微服务架构下有大量服务,每个服务都会暴露自己的API。随着时间推移,不同服务的API容易出现不一致、重复的情况。这给API的维护带来很大难度。同时,服务间存在复杂的依赖关系。一个API的实现可能依赖多个其他服务的API。这种依赖关系的管理非常复杂。一个API的变更会影响依......
  • Instagram 早期技术架构
    哈喽大家好,我是咸鱼想必大家都听说过Instagram,它是全球最受欢迎的社交媒体平台之一,拥有数十亿的活跃用户Instagram诞生于2010年,上线一周就坐拥10万注册用户,一年之内就拥有了1400万用户,可见扩张趋势突飞猛进。Instagram诞生的时候只有3个工程师,想必大家对【他们怎么......
  • Unity DOTS中ECS核心架构详解
    最近DOTS终于发布了正式的版本, 我们来分享一下DOTS中ECS的几个关键概念与结构,方便大家上手学习掌握Unity DOTS开发。 ECS中的World  Unity DOTS ECS架构中所有的Entity都是被放到了World对象里面,每个Entity在World里面都有唯一的Id号。Unity DOTS 可以同时支持很多个......
  • 阅读笔记(二)————《架构漫谈》
      架构漫谈是由资深架构师王概凯Kevin执笔的系列专栏,  读完第二章主要有下面几个方面:何为相?一般我们认为:看到一个东西,比方说杯子,“杯子”就是一个名字,指代的看到的东西就是相,就是事务的相状。我们一听到“杯子”这个词,脑海里就会浮现出一个杯子的形象。而“杯子”这......
  • 云原生架构实战06 Kubernetes的核心概念
    一、有状态和无状态二、对象规约和状态spec是规约规格的意思,描述了对象的期望状态--希望对象所具有的特征,当创建Kubernetes对象是,必须提供兑现对象的规约,用来描述该对象的期望状态,以及关于对象的一些基本信息(名称)状态status:表示对象的实际状态,该属性由k8s自己维护,会通过一系列......
  • 后端架构设计
    后端架构设计:1.用户管理模块1.1创建用户账户接口:POST/api/users功能:管理员通过提供用户名、密码和权限来创建新用户账户。处理:接收并验证管理员提供的信息,将用户信息存储到数据库中。1.2权限分配接口:PUT/api/users/{userID}/permissions功能:管理员可以通过指定用......
  • 高斯数据库HCNA之关系型数据库架构
    三、关系型数据库架构介绍1、数据库架构发展数据库架构变化随着业务规模增大,数据库存储的数据量和承载的业务压力也不断增加,数据库的架构需要随之变化,为上层应用提供稳定和高效的数据服务2、单机架构单机架构为了避免应用服务和数据库服务对资源的竞争,单机架构也从早期的单主机模......
  • 架构师进阶与新赛道的选择都要回到Framework里来
    我们总是在为了生活奔波,渐渐的迷失在了其中,但我们必须清楚的知道自己从哪里来,才能知道未来要到哪里去。自从毕业以后,我进入了一家小公司,开始了我Android开发之旅。在工作的几年中,虽然技术栈没有太大的变化,但我的工作重心主要集中在增删查改等低级工作上,而且并发量和数据量都非常低......
  • 浅述边缘计算场景下的云边端协同融合架构的应用场景示例
    云计算正在向一种更加全局化的分布式节点组合形态进阶,而边缘计算是云计算能力向边缘侧分布式拓展的新触角。随着城市建设进程加快,海量设备产生的数据,若上传到云端进行处理,会对云端造成巨大压力。如果利用边缘计算来让云端的能力下沉,则可以很好地解决海量数据的处理问题,让云端的数据......
  • 【金TECH频道】企业架构转型组合拳来袭,助力金融机构一臂之力
    当前,数字化转型已经成为时代共性课题在政策和技术的双重指引下金融机构逐渐走向差异化竞争的格局面对转型阵痛以契合、明晰的战略规划及企业架构调整来辅助业务变革成为助力企业数字化转型的有效路径金融机构也纷纷开始探索企业架构转型的新思路、新方法 但由于认知和经验的不......