传统MVP用在项目中是真的方便还是累赘?

低成本DIY手势捕捉手套:基于柔性传感器与IMU的机器人控制方案 在机器人控制、VR/AR交互及智能家居领域,实现精准、实时的动作捕捉是关键。传统基于计算机视觉的方案常受环境光线、遮挡和算力限制,而传感器融合技术提供了一种更稳定、低成本的替代路径。其核心原理是通过多种传感器(如测量物理形变的弯曲传感器和感知空间姿态的惯性测量单元IMU)直接采集数据,再经由滤波算法融合,从而获得连续、物理意义明确的动作信息。这种方案的技术价值在于其确定性、低延迟和高可靠性,尤其适用于需要实时精准反馈的工业控制与交互场景。本文聚焦于一种具体的应用实现——通过柔性弯曲传感器与六轴IMU(如MP 阅读详情

原文地址: https://gold.xitu.io/post/58b25e588d6d810057ed3659

前言(最后奉上福利)

自从Google在去年放出MVP的官方Sample后,越来越多的人开始加入MVP大军,MVP可谓在16年大放异彩,我也乘势推出了我的MVP框架狂刷了一波存在感

问题

但在使用当中我也发现了诸多弊端,导致很多初学者,在写过Sample后,就再也没在自己的项目中使用过MVP

MVP需要创建太多的类和接口,并且每次通信都需要繁琐的通过接口传递信息

这是大多数使用过MVP的朋友,最能感受到的,最近在帮公司技术面,我也时常问应聘者,能否尝试着解决这些问题?

解决方案

其实我之前已经有一套解决方案,其实也不能叫解决,只能说是缓解��

硬解决

所谓硬解决,便是使用比较暴力的方式��,通过Template自动生成需要的类和接口,这样少去了频繁的复制粘贴

软解决

所谓软解决,那就要动动脑子,稍微优雅的解决了��

  1. 对于逻辑简单的页面可以不使用Presenter,直接在Activity或Fragment中处理逻辑,在Presenter中如果不需要处理数据,也可以不实用Model

  2. Presenter和Model都可以无限制的重用,所以MVP的划分不需要太细粒度,稍微粗粒度一点,即不需要每个Activity或Fragment都给他划分一套MVP,可以几个Activity或Fragment使用同一个Presenter(使用同一个类不是同一个对象,这个Presenter含有可以共用的逻辑),也可一个Activity或Fragment根据不同的需求持有多个不同类型的Presenter对象,Model层同理,这样灵活使用,可以在一定程度上缓解MVP类和接口较多的缺点

并没有完全解决问题

通过上面的解决方案,是可以一定的缓解MVP的缺点,但是并不能完全解决上述缺点

比如想重用Presenter,Presenter就必须只含有公用的逻辑,而实际项目中公用的逻辑并不是那么多,所以能减少的类和接口也是很有限的,如果强制将不同页面的逻辑放在同一个Prsenter中,来达到重用的目的,那么每个Activity会被迫实现许多并不需要的方法,得不偿失

寻求解决方法

因此我看了大多数MVP框架,寻求如何彻底改善这个问题,像支付宝团队使用的TheMVP框架,是通过将Activity或Fragment作为Presenter,将UI操作抽到Delegate中,作为View层

TheMVP优点

这样做的好处是,不仅可以少写很多类,而且Presenter直接就可以和Activity或Fragment的生命周期做绑定,且可以随便重用View(但大多数场景都是重用Presenter,因为View层变化总是比其它层频繁)

TheMVP缺点

缺点就是不能重用Presenter,并且对于Presenter的实现有限制,必须是Activity或Fragment,如果要在其他地方实现Presenter,如Adapter,Dialog就必须根据它的特性重新写对应的Presenter基类

因为Presenter基类继承了Activity或Fragment,如果我们需要通过继承使用其他Activity或Fragment,那就又需要修改Presenter基类,一旦某个Activity需要继承其他不同的Activity,那又需要重新创建一个基于此Activity的Presenter基类,导致一个Activity或Fragment有多个不同的Presenter基类

分析问题,解决问题

总结一下MVP的缺点

1.粒度不好控制,控制不好就需要写过多的类和接口
2.如要重用presenter可能会实现过多不需要的接口
3.Presenter和View通过接口通信太繁琐,一旦View层需要的数据变化,那么对应的接口就需要更改

想要在根本上解决以上问题,我想必须换个思路,能不能通过改变传统MVP架构来解决这些问题?

实现*MVP现阶段有两种方式,各有优缺点:*

一个是将Activity或Fragment作为Presenter,抽象一个View层出来

一个是将Activity或Fragment作为View,抽象一个Presenter层出来

我想达到重用Presenter的目的,自然选择了后者

在某一天我突然想到了Handler,他只通过一个handleMessage方法,根据Message的what字段处理不同的操作,这样向上层提供一个统一的入口,下层不管如何改变并不会影响上层,并且同样可以实现多种的操作

于是根据这个思想,我重新改造了MVP架构,让Presenter通过Message和View层通信

如何实现

先上张图

具体做法是,VIEW层持有Presenter对象,当用户请求一个事件,则调用Presenter中的方法,并把持有View引用Message传给此方法,此方法处理完请求逻辑后将数据封装到Message中,并通过Message持有的View引用回调View的handleMessage方法,让View做不同的操作,最后释放掉Message的所有引用,放入消息池

Presenter并不直接持有View,方法执行完即表示和View的关系解除

和Handler的原理很像,Handler是将消息放入MessageQueue,Looper去轮循处理消息,我这里是将消息放入,Presenter的方法,并立即处理消息

总结

这样就能解决上述的缺点:

  1. 少写了很多类和接口

  2. 并且Presenter只需要通过handleMessage一个方法与View通信,也就不用繁琐的一直添加接口方法,只需要一个Message参数,通过Message封装数据,即使View需要的数据类型发生改变,也不需要更改任何方法,所以也不会影响上层调用

  3. 随便重用Presenter,即使你一个Activity,重用10个不同的Presenter,那也只用实现一个handleMessage方法,不需要实现View中其他用不到的方法,通过一个方法同样能做到不同的操作

  4. 当Presenter中的方法需要Activity传递一些数据时,也可以将数据封装到Message中传给Presenter,这样即使需要的数据类型发生改变,也不需要更改方法,所以也不会影响上层调用

只有能不断的灵活重用,才能感受到MVP的强大之处

说了这么多还是要看看Demo,具体该怎么做吧?

Go!觉得好一定要右上角Star哦!

Tips

现在的框架是一个比较轻量级的框架,没有网络层,后面会开一个分支提交比较完整的框架和文档,像MVPArms一样

– The end

手写TypeScript Agent:100行实现ReAct与Function Calling闭环 在AI应用开发中,智能体(Agent)是实现自主决策与工具调用的核心范式。其运行机制可概括为ReAct模式:模型通过推理(Reasoning)决定行动(Acting),借助函数调用(Function Calling)与外部工具交互。理解这一闭环是掌握LangChain等框架的基础,然而框架的抽象常使开发者难以排查工具调用失败、上下文丢失等问题。本文从最基础的Chat Completions接口出发,用TypeScript实现一个约100行的最小Agent,涵盖消息管理、工具注册、调度执行与多轮终止条件,清晰 阅读详情

相关推荐

MVP架构在xamarin android中的简单使用

好几个月没写文章了,使用xamarin android也快接近两年,还有一个月职业生涯就到两个年了,从刚出来啥也不会了,到现在回头看这个项目,真jb操蛋(真辛苦了实施的人了,无数次吐槽怎么这么丑),怪自己太年轻了,还好是给指定行业的人使用。 重新学习思考之后,再看自己在项目中的某些实现的代码,的确不尽人意,甚至想骂自己。 项目经常改,改来该去,代码一直增加,一个fragment也没什么功...

dotNet全栈开发 2124

[架构之路-195]-《软考-系统分析师》- MVC、MVP、MVVM架构各自的优缺点

一个controller对应多个view,model可以直接通过view。一个Presenter对应一个view,model不能通过view一个ViewModel可以对应多个View,model不能通过view。一、MVC1.1 MVC的基本结构MVC(Model-View-Controller)是桌面开发中常见的软件架构。标准的MVC架构图如下:Model(模型):外部数据库接口负责业务数据管理和处理,包括增删改查。Model必须提供外部可以操作模型数据的接口,同时在数据发生变化后能够通知外部。

文火冰糖(王文兵)的博客 2182

手把手教你用Node.js模拟大麦APP下单请求(含滑块验证处理)

本文详细解析了如何使用Node.js模拟大麦APP下单请求的全流程,包括接口逆向、滑块验证处理和签名算法逆向等关键技术。通过实战案例和代码示例,帮助开发者掌握移动端API调用的核心要素,如动态参数构造、安全验证突破等,提升自动化下单的成功率和效率。

weixin_42569329的博客 353

探索 JessYanCoding 的 AudioManagerSDK:一款强大的音频管理解决方案

探索 JessYanCoding 的 AudioManagerSDK:一款强大的音频管理解决方案 去发现同类优质开源项目:https://gitcode.com/ 项目简介 是一个由开发者 JessYanCoding 创建的开源项目,旨在为移动应用提供高效、灵活的音频管理服务。通过使用此 SDK,开发者可以轻松地处理音频播放、音量控制和音频焦点管理等复杂问题,从而专注于构建更优秀的用户体验。 技术...

gitblog_00043的博客 551

统信UOS系统网络服务异常排查:WIFI图标消失与网络设置缺失的解决方案

本文详细解析了统信UOS系统WIFI图标消失与网络设置缺失的常见问题,提供了从基础修复到进阶排查的完整解决方案。重点分析了NetworkManager服务异常的根本原因,包括系统更新中断、权限配置错误等,并给出实用的命令行操作指南和预防措施,帮助用户快速恢复网络功能。

weixin_29234239的博客 619

ANSYS_APDL实战入门——从零开始掌握模态分析

本文为ANSYS APDL模态分析实战入门指南,通过一个悬臂梁案例,手把手教你从零开始掌握APDL命令流。内容涵盖从模型创建、材料定义、网格划分到边界条件设置、求解及后处理结果查看的全流程,帮助工程师快速上手结构动力学分析,避免共振风险。

egg99的博客 1130

Android 今日头条屏幕适配详细使用攻略

今日头条屏幕适配的核心代码为基础进行了扩展封装,产生了《AndroidAutoSize》这个能快速接入使用的屏幕适配方案,这个屏幕适配方案是我遇到的截止2020.9.15为止最强大、简单有效的屏幕适配方案。...

luo_boke的博客 2万+

EDA的未来:当AI与Cadence Virtuoso相遇

本文探讨了AI技术与Cadence Virtuoso在EDA领域的融合,展示了如何通过生成式AI提升芯片设计效率。文章详细分析了Virtuoso设计环境的智能化演进、AI驱动的设计辅助功能实现路径,以及SKILL语言的进化方向,为工程师提供了未来EDA工具的发展趋势和实用案例。

weixin_28312391的博客 651

探索高效开发: JessYanCoding的ArmsComponent-Template

探索高效开发: JessYanCoding的ArmsComponent-Template 项目简介 是一个由开发者 JessYanCoding 创建的项目,旨在提供一种快速搭建Android应用基础架构的方法。该项目基于阿里巴巴的MVVM框架ArmsComponent,为开发者提供了模板化的初始化配置和最佳实践,以帮助他们更高效地开始新项目的开发。 技术分析 MVVM 架构 ArmsCompone...

gitblog_00028的博客 390

【S32K】S32K144入门笔记(4) Lin (Lin stack组件) 驱动超声波雷达实例

0. 引言 Lin这块是我一直没弄懂的部分。很多东西一知半解,当时感觉是硬凑了答案出来。 果然过标的时候出了问题,几个小伙伴帮忙一起刷夜也没搞定,好在标还是顺利过了,不然罪过大了。 之前做lin这块一直用的是linStack组件,这部分包含了协议栈部分,需要对lin的协议比较清楚和理解才好配置。 尤其是,图形界面配置完成后会生成一个ldf文件,这个文件很重要,所有的代码都是基于这个文件生成的,但是这个文件我确认没找到什么介绍资料,所以很多配置都是一点一点凑出来的,再实际验证的。 抓住这次写文档的机会,把当时

YoYo的桃子树 1万+

PSM倾向匹配详细步骤和程序

目录1.安装psmatch2统计包。2.数据准备3.数据分析及命令解读4.结果解读4.1模型拟合结果,此处无太多实际意义。4.2试验组可匹配的观测概览,按照命令中设定的匹配规则,试验组有8例患者未能匹配到合适对照。4.3结果解读的重点应该是对stata新生成的中间变量的解读。4.4均衡性检验结果4.5匹配结果的图示化5.Stata命令汇总最后留下两个问题给大家思考:题目 试验设计中,匹配的目的在于确保干预效应估计是建立在可比个体之间的不同结果的基础上。最简单的匹配方式是将干预组和对照组中协变量值相同的两个个

平平淡淡,戒急用忍,一生学闭嘴。 5万+

MVP 优缺点!简单易懂

缺点:M层和V层都需要和P层进行通许,会导致P层代码很复杂,而且都是通过接口通讯,如果一个P层用于多个Activity,所有Activity都要实现全部都接口,无论能不能用得到。V层和M层完全分离,方便协同工作,只需要专注做视图或者逻辑控制部分,不用关系对方的逻辑。V层对应Activity,只负责UI的展示和P层直接通信,和M数据层没有任何交互。代码结构清晰,P逻辑层可以用于多个视图,而不需要改变P层的逻辑。P层和V层通过接口通讯,会持有View的引用,容易造成内存泄露。复用率高方便单元测试。

m0_72899421的博客 533

ShardingJDBC支持批量插入数据

最近在进行分库分表,但是有张表,里面有一些批量的插入。 也就是: insert xxx values(...),(...),(...) 这样的语句。 开始我的依赖是: <dependency> <groupId>io.shardingjdbc</groupId> <artifactId>sharding-jdbc-core</artifactId> <v

谙忆-陈浩翔 9766

MVP+Dagger2设计,MVP架构模式实现新思路 (Demo)

&gt; MVP+Dagger2 -- Dagger2 是Google 的新一代依赖注入框架。 Android MVP使用Dagger2的sample代码- https://github.com/ChineseLincoln/Dagger2Mvp 将MVP,Dagger,Retrofit,Rxjava等技术相结合并用于快速开发的框架-https://github.com/JessYanCodi...

ShareUs的专栏 1949

基于STM32+Qt上位机设计的智慧停车场管理系统(207)

本项目设计了一套基于STM32+Qt上位机的智慧停车场管理系统。该系统融合了先进的嵌入式技术、图像识别技术、数据库技术和移动互联网技术,通过STM32硬件端实时采集车库现场信息,包括车牌识别、车位占用状态监测等,并将数据上传至Qt上位机进行处理与展示。利用MySQL数据库存储车辆出入库记录及车位使用情况,确保数据的安全性和可追溯性;通过Android手机APP为用户提供查询、支付等功能,实现远程交互与便捷服务。

3942

VC中sqlite的使用

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

Android新闻客户端

News 前言 谨以此项目送给那些即将踏入Android开发领域的小伙伴们,希望我的项目可以让你们更一步的了解Android开发。基础很好的小伙伴可以绕道了,这个项目不太适合你们! 项目介绍 基于Android平台的新闻阅读App,数据来源聚合数据,官网地址:https://www.juhe.cn/docs/api/id/235 , 新闻大致分为:头条,社会,国内等九大类型,采用侧滑菜单的模式,完...

android_mylife的博客 3922

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Android 框架

MVC MVP MVVM 框架学习

不要錯過才珍惜 2797

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Android Application Architecture 安卓APP架构

序 本文介绍了android应用的开发,经历了两次架构变革,第一次集成了RxJava第二次集成了MVP,并将RxJava与MVP完美结合,实现了低耦合,代码简单,测试方便的架构。 其实我们在开发中也遇到过,Android入门门槛较低,如果前期对APP规划不清,Coder们对未来把我不准,技术架构经验不够强大,最终导致就是一个Activity几千行,里面写了大量的Private方法,拆成几个Fr

jqjqjay的博客 1075

改造 Android 官方架构组件 ViewModel

前言 Android 官方架构组件在今年 5 月份 Google I/O 大会上被公布, 直到 11 月份一直都是测试版, 由于工作比较繁忙, 期间我只是看过类似的文章, 但没有在实际项目中使用过, 更没有看过源码, 所以对这几个组件的使用很是生疏, 同时也觉得这几个组件非常高大上, 非常神秘! 直到 11 月份 Android 官方架构组件正式版发布, 并且 Google 也在S...

a7715365的博客 99

KNN真的死了吗?从工程落地看算法的退场与升维

KNN(K-近邻算法)作为机器学习中最基础的实例学习方法,其核心原理是基于距离度量实现局部相似性决策。在高维灾难、实时推理瓶颈与内存约束加剧的现代系统中,传统暴力遍历式KNN确已难以满足低延迟、大规模、多模态等工程需求;但它的思想内核——‘邻居即证据、距离即关系’——正通过向量检索(如FAISS)、双塔推荐、kNN-LM等技术被深度继承与重构。它不再以原始形态主导线上服务,却在冷启动、嵌入式AI、医疗可解释诊断等强调白盒性、确定性与小样本鲁棒性的场景中不可替代。理解KNN的边界与演化,本质是理解算法工程化中

weixin_30239339的博客 341

李雅普诺夫第二方法精讲:不求解微分方程判定系统稳定性

在控制工程中,系统稳定性分析是控制器设计与验证的核心环节。工程人员常依赖仿真曲线判断收敛,但仿真只能证明特定轨迹有效,无法覆盖全部工况下的稳定性。李雅普诺夫第二方法(直接法)提供了一条严谨路径:无需求解微分方程,通过构造正定的能量型V函数并分析其沿轨导数的符号,即可判定系统的稳定、渐近稳定与全局渐近稳定性质。该方法特别适用于非线性系统,也能通过李雅普诺夫方程处理线性定常系统,配合LaSalle不变集定理还能解决半负定情形的判定。本文从能量直觉出发,拆解正定函数、径向无界、不变集等关键概念,结合四道完整例题与

weixin_33912246的博客 356

2017优秀开源项目

吊炸天!74款APP完整源码![干货]2017已来,最全面试总结——这些Android面试题你一定需要123个微信小程序源码分享(附下载)绝对干货-国内值得关注的官方API集合,很全很强大(必须收藏)2017年,身为Android开发的你必须要掌握的热门开源框架【干货】支付宝App架构揭秘—使用的开源组件总结!最新优秀的通用Android应用架构:从建项目开始 *Android 名企面试题及涉及知...

chuchun_langye的博客 2089
上一篇: 你不知道的Retrofit缓存库RxCache
下一篇: 我一行代码都不写实现Toolbar!你却还在封装BaseActivity?
JessYanCoding
博客等级 码龄10年 63粉丝 15原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值