聊聊 MVP 的缺点

简介: 聊聊 MVP 的缺点

设计 MVP 的目的:


  • 解锁 V 层的臃肿

极差体验:


1、继承

继承方式真的太糟糕了,BaseMVPActivity 本身是一种下沉到 lib 的通用类,但上层的业务层需要采用 BaseActivity 的方式来实现基础统计和埋点,意味着,我要么把 BaseMVPActivity 提到业务层,然后继承 BaseActivity,或是把 BaseActivity 下沉到 lib,供 BaseMVPActivity 继承,但我的业务统计就没办法用了。


public abstract class BaseMVPActivity<P extends MVPBasePresenter> extends BaseActivity implements MVPBaseView
复制代码

2、赋予 P 层生命周期感知


private P presenter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (presenter == null) {
            presenter = createPresenter();
        }
        presenter.attach((V) this);
    }
    @Override
    protected void onDestroy() {
        presenter.detach();
        super.onDestroy();
    }
复制代码


这种方式优缺点都有:


优点是:V 层在结束页面时,无需关心数据的释放动作

缺点是:P 层在 detach 时操作了 M 层的耗时任务,会直接导致 V 层 ANR

我觉得,P 层不应该具有生命周期的感知能力


3、糟糕的接口约束


V 层调用 P 层会制定一层接口来约束当前可调用的方法,P 层在完成任务动作时,也会通过约束接口将数据回调回给 V 层,接口制定如下:


public interface HandleContract {
    interface View extends BaseView {
        void startWayPointSuccess();
        void pauseWayPointSuccess();
        void resumeWayPointSuccess();
        void clearWayPointSuccess();
        void stopWayPointSuccess();
    }
    interface Present extends BasePresenter {
        void startWayPointMission();
        void pauseWayPointMission();
        void resumeWayPointMission();
        void clearWayPointMission();
        void stopWayPointMission();
    }
}
复制代码


之前一直认为,通过接口约束来实现 V 与 P 的调用模板,可以很清晰的明白双方的执行动作,但,在业务的持续变化中,由于某些接口约束已不再有用,我就需要不停的去修改这个接口模板,修改了模板之后,我还要去修改 V 层实现的方法,P 层实现的方法,并且,当业务量上来之后,整个接口调用层非常乱,为了跟踪一个功能,V 层跳 P ,P 层跳 V,跳了好几层,终于明白了这个功能实现了什么动作。

想法



我一直认为 ViewModel+LiveData+Lifecycles 是一个非常好的解决的方案,ViewModel 在 Framework 层面已经做了 ViewModelStore 的支持,Lifecycles 也在 ComponentActivity 中注册了 LifecycleRegistry,LiveData 在 observe(this,observer) 时持有了 LifecycleOwner,拥有了生命周期的感知能力。

1、第一点: 数据交互


View 层只需要初始化 ViewModel,订阅 ViewModel 中的 LiveData,以观察者的身份观察数据,一旦有数据的变化,就会自动更新到 View 中,而不需要像 V 与 P 的关系,在获取数据时,先触发 P,拿到数据后,P 层再调用 V 来更新数据,相比 ViewModel 的方式,多了一层手动设置数据返回,而为了数据返回,又多了一层接口模板来规范约束,最终,整个代码就是一个饼。

2、第二点:生命周期感知


LiveData 拥有的生命周期感知能力与 Present 还是有点区别的, 具体区别是在实现层面上:

1、LiveData 的生命周期感知是在 observe 时,将自己 addObserver 到 Lifecycle 中,让 Fragmentwork 层来赋予自己生命周期的感知能力

2、Present 生命周期感知是  BaseMVPActivity 赋予 BaseMVPPresent 的,如果我们的 Present 具有感知能力,就需要继承 BaseMVPPresent,这一点我在上面的继承中就表明了,这个是极差体验点,我们可以看下 ViewModel+LiveData 的方式,所有的操作都是在组合,组合的好处是什么呢?当然是为了在业务升级时有利于拆解和组装,而继承,不具有这样的特性

3、第三点:页面重建


屏幕旋转时页面发生重建,我们需要在在页面销毁时保存数据,重建时恢复,但数据的存储是有容量限制的,并且对象存储必须是序列化对象,苛刻的条件,Present 是无法做到的,然而,ViewModel 却是可以的,ViewModel 并不是通过 Bundle 的方式来实现数据的存储,而是通过 Framework 的支持,存储在 ViewModelStore 中,具体剖析可以查看文章 《ViewModel 凭什么能保存重建数据

目录
相关文章
|
监控 测试技术 Linux
性能测试工具
这篇内容介绍了几种性能测试工具和Linux监控命令。`ab`适用于简单接口测试,易用但扩展性差;`JMeter`功能强大,可扩展,但稳定性不足;`LoadRunner`专业稳定,但需付费。此外,还提到了几个Linux监控命令,如`top`、`vmstat`、`pidstat`和`jstat`,用于系统性能监控和内存使用情况检查。
346 0
|
传感器 监控 物联网
物联网技术在消防装备管理系统中的创新应用
随着科技发展,物联网技术已广泛应用于公共安全领域,尤其在消防装备管理中发挥了重要作用。它克服了传统管理中信息更新滞后、维护不周等难题,通过构建包含智能感知、网络传输、数据处理及应用服务的多层次系统,实现了装备的实时监控、智能调度与高效管理,提升了救援效率和安全性。此外,物联网技术还支持资源优化配置与预测性维护,为消防工作提供强有力的技术支撑。
270 0
物联网技术在消防装备管理系统中的创新应用
|
消息中间件 安全 Kafka
Python IPC机制全攻略:让进程间通信变得像呼吸一样自然
【8月更文挑战第2天】在编程领域中,进程间通信(IPC)作为连接独立运行单元的关键桥梁,其重要性不言而喻。本文以Python为例,深入探讨了IPC的各种机制。首先对比了管道与消息队列:管道作为一种基础IPC机制,适用于简单场景;而消息队列通过第三方库如RabbitMQ或Kafka支持更复杂的多生产者多消费者模型,具备高并发处理能力。
396 1
|
负载均衡 Java 数据处理
【C++ 并发 线程池】轻松掌握C++线程池:从底层原理到高级应用(三)
【C++ 并发 线程池】轻松掌握C++线程池:从底层原理到高级应用
836 2
|
机器学习/深度学习 算法 调度
|
Java Spring
spring boot 转 graalvm-native-images 的一些限制
spring boot 转 graalvm-native-images 的一些限制
|
传感器 人工智能 算法
逐渐走向实用,揭秘世界顶尖人形机器人ASIMO
从《列子·汤问》传说中以假乱真的舞者到现在科幻作品中的各种类人机器人,人类从没停止过对创造类人机器的幻想。而随着机器人学、人工智能和计算科学等科学技术的发展,人类长久以来的梦想正在逐渐成为现实,我们的生活中也渐渐开始有了它们的身影。
1432 0
逐渐走向实用,揭秘世界顶尖人形机器人ASIMO
|
JavaScript 前端开发 Serverless
函数计算新功能— 支持 Node.js 18 、Node.js 20 运行时
从2024年2月起,函数计算正式发布 Node.js 18 运行时和 Nodejs.20 运行时,函数计算2.0和函数计算3.0都支持新的运行时,目前新运行时处在公测状态,欢迎大家来体验。
954 0
|
存储 缓存 资源调度
从pnpm到npm的核心管理机制(一)
我们应该了解完整的npm包管理生态,然后才可以得知为什么pnpm打击了哪些痛点,以及如何应用到我们的实际项目中。
424 0
|
缓存 资源调度 前端开发
该从什么角度思考npm、yarn与pnpm的区别
该从什么角度思考npm、yarn与pnpm的区别
该从什么角度思考npm、yarn与pnpm的区别