在“FluxJava: 给 Java 使用的 Flux 库”这篇文章中提到,设计中使用 MVP 最大的问题,是会让不同的画面形成一组、一组的 Class,但各组之间是独立的。MVP 最基本的设计概念中,只描述了同一组内 Class 如何互动,并没有提到组内的 Class 如何跨组与其他的 Class 互动。当设计上出现要跨组的情况时,就得要仰赖设计者的功力与经验了。

就 MVP 的精神,View 要负责的工作,只是把 Presenter 送来的 Model 内容呈现在画面上。并且,与使用者互动,接收使用者的意图、收集使用者输入的数据,再交由 Presenter 处理。至于其他与 Business Logic 有关的事,不会由 View 来经手。

画面的切换由谁负责

在只有单一画面的情况之下,看起来很合理、分工明确,在设计上应该是个无可挑剔的方案。只是当画面一多起来,随之出现了一个问题:画面的切换由谁负责?

有问题吗?View 是负责使用者互动的,当然画面的转换由 View 来做啰!

也对,以 Android 平台为例,发送 Intent 大多是在 Activity 或是 Fragment 上处理的,再自然不过了。等新的 View 被载入后,再去启动与其配对的 Presenter、让 Presenter 把数据送过来。流程上都还在设计的预想之内,跨组的工作的确就由 View 来完成即可。

在画面与画面的顺序固定的情况下,看起来是没什么问题。如果画面的切换要依据数据的状态来决定呢?

刚才有提到,为了保持每个 Class 任务的单纯性,View 应该与 Business Logic 无关。要让 View 根据数据状态来决定,某种程度上就是 Business Logic,这样是不是违反了一开始提到的精神?

而且判断时所依据的数据,很可能跟 View 要显示的内容无关,又或者是一个复杂的逻辑,又更加深了是否该放在 View 上的疑虑。

Presenter 是否要跨平台

不放在 View 又要放在哪?Presenter 上吗?

这应该是在简单的 MVP 结构之下,大多数人的选择。当整个结构中,就只有 Model、View、Presenter,自然是只能由 Presenter 来存取数据库、负责数据处理逻辑。此时再多加一项,依据数据决定画面切换方式,好像也没有什么不恰当。

先回到 Android 平台上,来看看这样的安排会出现什么情况。

Presenter 要能够控制 Activity 的转换,必须要取得 Context,这也意味着 Presenter 与 Android 平台绑在一起。所以当这样的设计内容,要移到不同的平台上,Presenter 就有可能要面临大幅度在设计上的修改。换句话说就是,把工作放在 Presenter 上,会将设计限制在特定的平台上。

把 Context 排除在 Presenter 之外,就可以避免这个问题了吗?

就算是 Presenter 不直接控制 Activity 的转换,只决定要切换哪一个 Activity,Presenter 势必要有 Activity 的资讯,不管是 Type 或是 Class 名称。换了一个平台,显示画面的 Class 还会是相同的名称吗?可以确定的是 Type 一定不一样。

MVP 套用在 Android 上的问题

那就不要跨平台,大不了新的平台把设计再重做一次!

其实对 Android 平台来说,问题还不止如此。以 Master-Detail 的画面配置当例子,不同屏幕尺寸的情况下,会有一个 Activity 和二个 Activity 的差别。

原本在大屏幕中,一个 View、一个 Presenter 就做完的事,到了小屏幕却变成二个 View,那 Presenter 也要跟着拆成二个?

假设答案是肯定的,也就是说同一个 App 里,同样用途的画面就做了三组 View/Presenter。不对,在 Android 的 Master-Detail 的模板中,Master 的 Activity 是共用的,那岂不变成同一个 View 有二个 Presenter 配对?

这样的设计好像有点累赘,但真的要在这样的设计下,把流程串起来也不是不行。不过,要由 Master-Detail 跳到其他画面的工作,应该三个 Presenter 都相同,是不是要抽离出来,不要在 Presenter 里做?

结果,画面切换要由谁负责的问题又绕回到原点。

当有使用 Service 或 BroadcastReceiver 的需求时,又会引发不同的问题。

没有套用 MVP 之前,都是很直觉地在 Activity 中进行 Service 的使用。Service 大部份是用来进行后端数据处理的作业,这样的 Service 该由 View 来启动吗?不是应该透过 Presenter?

现在前端不适合启动 Service,那该由谁接手?Presenter 吗?

是比 View 合适的选择,但这样又会回到 Presenter 要不要独立于平台之外的问题上。

再者,Service 完成作业之后,如果要以 BroadcastReceiver 的流程来通知外部。BroadcastReceiver 可以放在 Activity 上吗?MVP 传送数据不是都要透过 Presenter?Service 在用来处理数据时,算是后端,不用经过 Presenter 吗?

MVP 设计的下一步

在“MVC 与 MVP 的抉择”一文中提到,把 MVP 中的 View 视为 Sub System,其实并不是突发奇想。而是在导入 MVP 时,用来应对在设计上所碰到的诸多问题的一个环节。

如果要深入的说明整个构思的内容,由于篇幅可能会很大,未来在时间允许之下,会有更多有关这方面的文章来做讨论。

android flux 与mvp,使用 MVP 时在设计上的考量相关推荐

  1. Android中常见的MVC/MVP/MVVM模式

    Android中常见的MVC/MVP/MVVM模式 经典MVC 在1979年,经典MVC模式被提出. 在当时,人们一直试图将纯粹描述思维中的对象与跟计算机环境打交道的代码隔离开来,而Trygve Re ...

  2. Android——超简单 MVC、MVP、MVVM入门系列

    2022年,新年第一篇文章,本篇文章将用非常简单的言语来描述各框架,尽量让大家一看即会. 前言: 相信不少伙伴在进行Android开发的时候,肯定遇见过 Activity 代码上千行的,这种代码非常难 ...

  3. Android开发框架模式MVC、MVP使用总结

    一.基础概念 Android中最常用的框架开发模式是MVC和MVP.        这里要区分设计模式和框架模式.设计模式有23种,比如单例模式,工厂模式,适配器模式等等,都是java的设计思想相关的 ...

  4. Android使用RxJava+Retrofit2+Okhttp+MVP练习的APP

    Android使用RxJava+Retrofit2+Okhttp+MVP练习的APP 项目截图 这是我的目录结构 五步使用RxJava+Retrofit2+Okhttp+RxCache 第一步:导包 ...

  5. Android开发中MVC、MVP到MVVM演化

    文章目录 一般模式 activity_normal.xml NormalActivity Account MCallback MVC MVC简介 MVC各层功能 MVCModel MVCActivit ...

  6. 【Android】Android安卓架构MVC、MVP、MVVM之间的区别和联系(图解+案例+源码)

    https://github.com/SETANDGET/AndroidArchitectureDemo 代码 一.问题背景 二.Android安卓架构MVC.MVP.MVVM 1.MVC(Model ...

  7. [最全]Android安卓架构MVC、MVP、MVVM之间的区别和联系(图解+案例+源码)

    一.问题背景 博主最近在准备春招面试中介绍自己简历中Android项目的MVP架构,但是博主发现若自身不彻底弄懂Android安卓架构MVC.MVP.MVVM之间的区别和联系,博主将无法准确地向面试官 ...

  8. mvp+dagger2_Android MVP + Dagger2 +改造+ RxJava

    mvp+dagger2 In this tutorial, we'll be developing an application using MVP, Dagger2, Retrofit and Rx ...

  9. Android - Flux架构

    本文的合集已经编著成书,高级Android开发强化实战,欢迎各位读友的建议和指导.在京东即可购买:https://item.jd.com/12385680.html Flux架构, 顾名思义表示流, ...

最新文章

  1. Python---20行代码爬取斗鱼平台房间数据(上)
  2. Hibernate Cascade 属性
  3. 力扣Java编译器_力扣--设计单链表
  4. linux 定时备份mysql数据库
  5. directsound抓取麦克风PCM数据封装类
  6. centos8.4 nginx 问题
  7. ASP.NET伪静态 UrlRewrite(Url重写) 实现和配置
  8. 消除左递归实验代码_「leetcode」669. 修剪二叉搜索树:【递归】【迭代】详解!
  9. Verlet integration (Verlet 积分法)
  10. horizontal center and vertical middle in CSS
  11. excel乘法公式怎么输入_python吊打Excel?那是你不会用!
  12. Abstract class 与Interface 抽象类和接口
  13. 不在更改国内网络账号的ID了
  14. C# 异步调用控件 跨线程调用控件 跨线程赋值
  15. 千呼万唤始出来,犹抱琵琶半遮面,揭开ArrayList的扩容机制的神秘面纱
  16. php 数组的结构和定义
  17. Terracotta 3.2.1简介 (一)
  18. Leetcode 1823 找出游戏的获胜者 (约瑟夫环问题)
  19. 微信小程序电商首页开发基本思路
  20. 呼伦贝尔~根河~鄂温克族

热门文章

  1. 总结一下silverlight文章,然后死等10月10日的正式版
  2. 【Hibernate】getHibernateTemplate与getSession的区别以及优缺点
  3. 大话设计模式—观察者模式
  4. Class.getResource()、ClassLoader.getResource()和this.class.getClassLoader()解析
  5. Error与RuntimeException
  6. 仿抖音注册Dialog实现
  7. 2018年最具就业前景的7大编程语言:Java、Python、JavaScript、C++、C#、PHP、Perl ......
  8. nginx部署下SSE实现心跳功能
  9. winform 配置文件的加密解密
  10. Objective-C学习笔记--NSLog用法及例子