Flow和Mortar的调查

发表于 5年以前  | 总阅读数:1661 次

原文链接 : Architecting An Investigation into Flow and Mortar

“在 App 开发过程中尽可能使用 Fragment 替代 Activity”,Google 官方的这个建议无疑让万千 Android 开发者开始关注、使用 Fragment。但随着使用 Fragment 的人数增多,Fragment 存在的各种问题也开始暴露,在各种 Android 社区中,已经开始有人质疑用 Fragment 替代 Activity 在应用开发中是否真的像 Google 说的那样有益。质疑 Fragment 的理由大体如下:

  • 在使用 Fragment 时,我们只能选择使用默认的构造方法,而不能自由地构造我们想要的构造方法。

  • 嵌套使用 Fragment 很容易出现各种奇奇怪怪的 Bug,抑或是受到种种让人郁闷的限制。

  • Fragment 自身的生命周期非常复杂。

更让人哭笑不得的是,让这部分开发者坚定地站在“反 Fragment”队伍中的原因竟然是:在开发过程中使用 Fragment 完全不能让这部分 Android 开发者感受到使用 Fragment 能给他们带来的便利和愉悦;相反,使用 Fragment 给他们带来的是无尽的困然和烦恼。真不知道 Google 看到这些批评 Fragment 的帖子会想什么…………

但在我们的 Android 学习社区 Big Nerd Ranch 中,我们制作的 Android bootcamp 课程一直坚持使用 Fragment ,并且为大家介绍 Fragment 给我们带来的种种便利和好处(特别是 Android 开发的新手),此外,我们还在我们做的 资讯项目 中广泛地使用了 Fragment。

然而,虽然我们是 Fragment 的忠实粉丝,但本着不断学习和探索新知识的心态,我们还是对现有的 Android 库进行了相当多的研究和探索,以求能够找到 Fragment 的最佳替代物,帮助这些备受煎熬的 Android 开发者早日脱离苦海,走向 Android 开发的美丽新世界。

进入Flow和Mortar

奉行着想毁灭世界上所有 Fragment 的信条,Square 大概在一年前介绍了两个全新的库: Flow 和 Mortar。作为反 Fragment 教主,Square 还创造了许多很好的库:

我只想说,我相信他们,我认为任何来自Square的资源可能是有用的或者至少是有趣的,所以他们的项目都值得一看。

在我们深入了解这些库之前我想提醒大家的是,Square只在他们内部的一小部分项目中使用这些库,并且我在写本文章时这些库还在预发布阶段。也就是说,这两个库在最近几个月取得了积极的进展,这预示着一个值得尊敬的未来,虽然库就像流沙,随时可能改变,崩溃甚至停止发布,但库所依赖的核心架构原则是一成不变的。

体系架构

首先,我们先来看下 Android 应用的体系架构,在 Android Honeycomb 被使用之前,甚至在Fragment 出现之前,开发 Android 应用的标准模式是创建许多 Activity。在那个时候最常见的现象是:大多数开发者都没有规范地遵循 MVC模式进行开发,不过这也很正常。因为模型(Model)依赖于数据,传统的一些数据库或者是以 JSON 的形式存储的 Web 请求,抑或是各种各样的java对象枚举。开发者们很高兴地通过 XML 布局去为 Activity 设置 View ,而且 View 的控制器就是每一个屏幕显示的 Actvitiy 自身。

虽然这只是一个简要的概述,但是你能从中了解到 Android 与 MVC 模式是如何自然契合的。 mvc-pre

随着 Fragment 在 Honeycomb 中的出现,Android 团队也让处理不同形式的事件变得更简单。到了今天,标准的 Android 应用架构已经转变为由一小部分的 Activity 和 许多 Fragment 构成,使得我们的 App 能够在 手机、平板、智能手表甚至是太空船上跨平台使用。 mvc-post

在这样的愿景下,有关 Fragment 的一切都是美好的,Fragment 变得流行起来,将一个 Activity 分解为几个 Fragment 是被提倡的。除此以外,即使 Activity 常常被简化为 Fragment 的持有者,或者是 Fragment 和 系统之间的接口,Android 应用的架构仍然遵循着 MVC 模式。

但到底是 Activity 不能实现我们 App 跨平台使用的愿望,还是我们没有用正确的方式使用 Activity呢?也许,如果将 Activity 与 自定义 View结合在一起使用,说不定不需要 Fragment 就能让 Activity 实现跨平台使用的目标呢。使用 Flow 和 Mortar库背后的关键目的就是探索这个问题,并得到确切的答案。Flow 和 Mortar 的工作通过用自定义 View 代替 Fragment,并使用注入自定义 View 中的特定 Controller 对象,控制视图,以此允许我们通过 View 来代替 Fragment 完成工作。 mvc-no-fragments

我们将在我们的讨论中构建这个图的中间部分,弄清楚如何在不使用 Fragment 的情况下把不同的视图碎片拼凑到一个 Activity 里。我们会看着标准MVC架构演变成完全不同的东西,这将大量涉及到咱们的Flow和Mortar。

那么,Flow和Mortar到底是什么?它们又是如何起作用的呢?

Flow

Flow 将一个应用分成一个逻辑上的 Screen组合,Screen不是任何形式的特殊的库对象,而是一个被创造来代表我们应用视图的普通java对象(POJO)。每一个Screen是这个app里面自包含的段,他们有自己的功能和意图。一个Screen的用处和传统Activity的用处没有什么不同,应用程序中的每一个Screen都对应于一个特定的位置,有点像一个Android中的URL网页或者是特定的隐式Intent。所以,Screen类可以被看作是应用中某个部分自带的可读定义。

我们应用中的每一个Activity将会成为一个 Flow 对象,Flow对象在返回栈中保存了 Screen 的记录,和 Activity 或者 FragmentManager 的返回栈有些类似,通过这样的设计允许我们在 Screen 之间通过简单地实例化就可以轻松的切换,而不需要在应用中包含很多Activity。这里有一小部分 Activity(最好是一个)来持有这些 Screen。他们之间的关系下图类似: screen

如果我们想切换到一个新的 Screen,我们只需简单地实例化这个 Screen,并且告诉我们 Flow 对象帮助我们切换为这个 Screen。除此以外,正如我们所期待的,Flow 被实例化后也会实现 goBack() 和 goUp() 方法。然而,许多开发者都把 Java 中的 goto 语句看作洪水猛兽,但事实上 Java 中的 goto 语句并没有它听起来那么恐怖。 flow

从本质上看,Flow 的作用仅仅是在 App 中告诉我们将要切换到哪一个 Screen。而这样设计的好处在于,Flow 通过这样的设计让我们能够方便地在我们定义的各种不同的自定义 View 中切换,并使我们免受在 Activity 或 Fragment 需要考虑的种种麻烦,让我们把注意力都集中在处理 View上。Flow 为我们创造了一个简单,方便,以 View 为中心的应用架构。

Mortar

Mortar是一个专注拖拽和依赖注入的库,Mortar 用以下几个不同的部分将一个应用分为可组合的模块:Blueprints, Presenters and a boatload of custom Views。

Mortar App里的每一个部分(在这里指的是每一个 Screen,因为我们在使用 Flow)都由 Blueprint 定义,并赋予他们一个私有的 Dagger 模块。它看起来有点像是下面这样的

blueprint

Flow 和 Mortar 结合在一起使用的效果很好,我们只需要调节我们的 Screen 类实现去 Mortar 提供的 Blueprint 接口,然后它就会给我们一个可以自由使用的 Dagger 作用域。

presenters

Presenter 是一个拥有简单生命周期和伴随其生命周期的 Bundle 的 View 私有对象,主要被用作该 View 的控制器。每一个 View 都有存在于对应的 Screen (还有 Blueprint)中,与 View 自身相关联的 Presenter。因为 Presenter 只能作用于他所在的 Screen,所以当我们使用 Flow 进入一个新的 Screen,Presenter(在我们这个架构中非常重要的一环) 很可能会被 Java 的垃圾回收机制自动回收掉。此外,在 Mortar 作用域中的 Dagger 将与自动垃圾回收机制结合在一起,使得我们 App 能更好的管理、使用其内存——其中原因当然是:当前没有被使用的控制器对象都被我们回收掉了。而在传统的 Activity 开发中,Fragment 和 Activity 的切换过程中,不经意的垃圾回收并不能很好的被注意和提防。

由于自定义 View 在我们的架构中被频繁地使用,以至于我们只需要通过 Dagger 简单地注入所有重要的模型数据,然后使用与 View 关联的 Presenter 去控制 View 本身。即使配置被改变,Presenters 也不会消失,而且我们还非常了解与 Activity 生命周期相关的知识,使得 Presenters 在进程被杀死之后还能被恢复。事实上,Presenter 与 Activity onSavedInstanceState() 方法的 bundle 钩连在一起,使得它能够用与 Activity 相同的机制储存和读取配置改变后产生的数据。而 Presenter 的生命周期非常简单,只有四个回调方法:

  • onEnterScope(MortarScope scope)
  • onLoad(Bundle savedInstanceState)
  • onSave(Bundle outState)
  • onExitScope()

完全没有 Fragment 那样复杂的生命周期,这可不是我吹的!

文章写到这里,你会发现在 Flow 和 Mortar 中有许多发生改变的部分,新的术语和类,还有新的使用规范,这难免会让人一头雾水。所以为了方便大家的理解,总的来说,我们需要重视的是下面几个部分:

  • Screen: 在应用导航层次结构中的一个特殊存在,用来代表我们视图的对象
  • Blueprint: 应用中具有私有的 Dagger 模块的部分
  • Presenter: 一个 View 控制器对象
  • Custom Views: 通过 Java 代码定义的 View,当然,用 XML 定义也是很常见的

Here’s what our final Mortar and Flow architecture looks like:

我们 Mortar 和 Flow 整个体系架构将会如下所示:

抛弃了对 MVC 模式的执念,这个架构在完成之后变得更像 MVP 模式。这样巨大的转变使得新的架构需要关注如何处理应用在运行时配置信息改变的问题,例如:旋转。在 MVC 模式中,我们的控制器(Activity 和 Fragment)会随着我们的 View 一起被杀死。然而,在 MVP 模式中,我们只有 View 被杀死,又在需要它的时候重现它。挺有趣的对吧?

积极的反馈

为了摆脱 Fragment,Square 付出了无数的汗水去进行重新架构和设计,并完成了 Mortar 和 Flow库,他们当然会获得相应的回报,接下来我就给大家介绍这两个库给我们带来的好处吧。

使用 Mortar 和 Flow 库强迫我们创建了一个符合 MVP 模式设计的模块化 App 结构,通过这样做能有效地帮助我们保持代码的整洁。

通过对我们自定义 View 和 Presenters 的依赖注入,测试变得更简单了

动画能够在 View 层被处理,而不用像从前在 Activity 和 Fragment 中使用时那样担心动画会出现Bug

Mortar 在 View 和 Presenter 层中自动进行垃圾回收以处理其作用域,意味着应用能更有效地利用内存

可优化的空间

尽管 Flow 和 Mortar 给我们带来了许多好处,但是它们也还存在一些问题:

想要熟练使用 Flow 和 Mortar,需要面对一条陡峭的学习曲线。在你真正理解这两个库的设计思想和原理之前,它们的使用模式看起来非常复杂,如果你想要将他们用的得心应手,无疑需要大量的探索和实验,此外,这些库并不是为初学者提供的,我们更建议初学者先学习如何正确和有效地使用 Activity 和 Fragment,我可不是吓唬你们,这样跟你们说吧,就算是 Android 开发大神,在面对这些库时仍需要花费大量的精力和时间去学习有关设计模式的知识,才能真正理解这个库。

如果你正准备使用 Mortar 和 Flow 库,你真的要全面了解它们的用法。因为让它和标准的“少使用 Fragment”开发模式相互作用是很困难的。如果你想修改一个已经写好的项目,让它使用 Mortar 和 Flow,虽然不是不可能的,但是完成这个目标的过程会是非常漫长和艰难的。

这里还存在无数的模板和配置信息需要被处理。而这正是我最大的担忧,在使用这些新的类和接口时,我常常觉得被淹没在无趣的代码海洋里,因为这些代码都被设计成和其中的各个类、接口钩连在一起,而这也的设计让我觉得这两个库并没有像我期待的那样有趣。

接下来呢

不过现在 Mortar 和 Flow 库都处于预发布阶段,现在也没有官方发布的版本。这意味着 Square 还在处理这两个库存在的问题,改动和更新,但这同样也意味着它们还需要许多时间作改进,才能真正投入到使用中。

使用 Mortar 和 Flow 库是个有趣的体验,我非常享受使用各种新的库和寻找官方以 Fragment 为导向的应用结构的替代品,但我并不认为 Mortar 和 Flow 是 Android 寻找的替代 Fragment 的办法,毕竟 Fragment 可能在接下来的几个月或者几年中被修改。但我仍然希望这些项目能够引起更多人关注,并且继续优化,我肯定会继续关注他们的最新进展的,希望大家继续关注我的博客哦。

 相关推荐

刘强东夫妇:“移民美国”传言被驳斥

京东创始人刘强东和其妻子章泽天最近成为了互联网舆论关注的焦点。有关他们“移民美国”和在美国购买豪宅的传言在互联网上广泛传播。然而,京东官方通过微博发言人发布的消息澄清了这些传言,称这些言论纯属虚假信息和蓄意捏造。

发布于:1年以前  |  808次阅读  |  详细内容 »

博主曝三大运营商,将集体采购百万台华为Mate60系列

日前,据博主“@超能数码君老周”爆料,国内三大运营商中国移动、中国电信和中国联通预计将集体采购百万台规模的华为Mate60系列手机。

发布于:1年以前  |  770次阅读  |  详细内容 »

ASML CEO警告:出口管制不是可行做法,不要“逼迫中国大陆创新”

据报道,荷兰半导体设备公司ASML正看到美国对华遏制政策的负面影响。阿斯麦(ASML)CEO彼得·温宁克在一档电视节目中分享了他对中国大陆问题以及该公司面临的出口管制和保护主义的看法。彼得曾在多个场合表达了他对出口管制以及中荷经济关系的担忧。

发布于:1年以前  |  756次阅读  |  详细内容 »

抖音中长视频App青桃更名抖音精选,字节再发力对抗B站

今年早些时候,抖音悄然上线了一款名为“青桃”的 App,Slogan 为“看见你的热爱”,根据应用介绍可知,“青桃”是一个属于年轻人的兴趣知识视频平台,由抖音官方出品的中长视频关联版本,整体风格有些类似B站。

发布于:1年以前  |  648次阅读  |  详细内容 »

威马CDO:中国每百户家庭仅17户有车

日前,威马汽车首席数据官梅松林转发了一份“世界各国地区拥车率排行榜”,同时,他发文表示:中国汽车普及率低于非洲国家尼日利亚,每百户家庭仅17户有车。意大利世界排名第一,每十户中九户有车。

发布于:1年以前  |  589次阅读  |  详细内容 »

研究发现维生素 C 等抗氧化剂会刺激癌症生长和转移

近日,一项新的研究发现,维生素 C 和 E 等抗氧化剂会激活一种机制,刺激癌症肿瘤中新血管的生长,帮助它们生长和扩散。

发布于:1年以前  |  449次阅读  |  详细内容 »

苹果据称正引入3D打印技术,用以生产智能手表的钢质底盘

据媒体援引消息人士报道,苹果公司正在测试使用3D打印技术来生产其智能手表的钢质底盘。消息传出后,3D系统一度大涨超10%,不过截至周三收盘,该股涨幅回落至2%以内。

发布于:1年以前  |  446次阅读  |  详细内容 »

千万级抖音网红秀才账号被封禁

9月2日,坐拥千万粉丝的网红主播“秀才”账号被封禁,在社交媒体平台上引发热议。平台相关负责人表示,“秀才”账号违反平台相关规定,已封禁。据知情人士透露,秀才近期被举报存在违法行为,这可能是他被封禁的部分原因。据悉,“秀才”年龄39岁,是安徽省亳州市蒙城县人,抖音网红,粉丝数量超1200万。他曾被称为“中老年...

发布于:1年以前  |  445次阅读  |  详细内容 »

亚马逊股东起诉公司和贝索斯,称其在购买卫星发射服务时忽视了 SpaceX

9月3日消息,亚马逊的一些股东,包括持有该公司股票的一家养老基金,日前对亚马逊、其创始人贝索斯和其董事会提起诉讼,指控他们在为 Project Kuiper 卫星星座项目购买发射服务时“违反了信义义务”。

发布于:1年以前  |  444次阅读  |  详细内容 »

苹果上线AppsbyApple网站,以推广自家应用程序

据消息,为推广自家应用,苹果现推出了一个名为“Apps by Apple”的网站,展示了苹果为旗下产品(如 iPhone、iPad、Apple Watch、Mac 和 Apple TV)开发的各种应用程序。

发布于:1年以前  |  442次阅读  |  详细内容 »

特斯拉美国降价引发投资者不满:“这是短期麻醉剂”

特斯拉本周在美国大幅下调Model S和X售价,引发了该公司一些最坚定支持者的不满。知名特斯拉多头、未来基金(Future Fund)管理合伙人加里·布莱克发帖称,降价是一种“短期麻醉剂”,会让潜在客户等待进一步降价。

发布于:1年以前  |  441次阅读  |  详细内容 »

光刻机巨头阿斯麦:拿到许可,继续对华出口

据外媒9月2日报道,荷兰半导体设备制造商阿斯麦称,尽管荷兰政府颁布的半导体设备出口管制新规9月正式生效,但该公司已获得在2023年底以前向中国运送受限制芯片制造机器的许可。

发布于:1年以前  |  437次阅读  |  详细内容 »

马斯克与库克首次隔空合作:为苹果提供卫星服务

近日,根据美国证券交易委员会的文件显示,苹果卫星服务提供商 Globalstar 近期向马斯克旗下的 SpaceX 支付 6400 万美元(约 4.65 亿元人民币)。用于在 2023-2025 年期间,发射卫星,进一步扩展苹果 iPhone 系列的 SOS 卫星服务。

发布于:1年以前  |  430次阅读  |  详细内容 »

𝕏(推特)调整隐私政策,可拿用户发布的信息训练 AI 模型

据报道,马斯克旗下社交平台𝕏(推特)日前调整了隐私政策,允许 𝕏 使用用户发布的信息来训练其人工智能(AI)模型。新的隐私政策将于 9 月 29 日生效。新政策规定,𝕏可能会使用所收集到的平台信息和公开可用的信息,来帮助训练 𝕏 的机器学习或人工智能模型。

发布于:1年以前  |  428次阅读  |  详细内容 »

荣耀CEO谈华为手机回归:替老同事们高兴,对行业也是好事

9月2日,荣耀CEO赵明在采访中谈及华为手机回归时表示,替老同事们高兴,觉得手机行业,由于华为的回归,让竞争充满了更多的可能性和更多的魅力,对行业来说也是件好事。

发布于:1年以前  |  423次阅读  |  详细内容 »

AI操控无人机能力超越人类冠军

《自然》30日发表的一篇论文报道了一个名为Swift的人工智能(AI)系统,该系统驾驶无人机的能力可在真实世界中一对一冠军赛里战胜人类对手。

发布于:1年以前  |  423次阅读  |  详细内容 »

AI生成的蘑菇科普书存在可致命错误

近日,非营利组织纽约真菌学会(NYMS)发出警告,表示亚马逊为代表的电商平台上,充斥着各种AI生成的蘑菇觅食科普书籍,其中存在诸多错误。

发布于:1年以前  |  420次阅读  |  详细内容 »

社交媒体平台𝕏计划收集用户生物识别数据与工作教育经历

社交媒体平台𝕏(原推特)新隐私政策提到:“在您同意的情况下,我们可能出于安全、安保和身份识别目的收集和使用您的生物识别信息。”

发布于:1年以前  |  411次阅读  |  详细内容 »

国产扫地机器人热销欧洲,国产割草机器人抢占欧洲草坪

2023年德国柏林消费电子展上,各大企业都带来了最新的理念和产品,而高端化、本土化的中国产品正在不断吸引欧洲等国际市场的目光。

发布于:1年以前  |  406次阅读  |  详细内容 »

罗永浩吐槽iPhone15和14不会有区别,除了序列号变了

罗永浩日前在直播中吐槽苹果即将推出的 iPhone 新品,具体内容为:“以我对我‘子公司’的了解,我认为 iPhone 15 跟 iPhone 14 不会有什么区别的,除了序(列)号变了,这个‘不要脸’的东西,这个‘臭厨子’。

发布于:1年以前  |  398次阅读  |  详细内容 »
 相关文章
简化Android的UI开发 5年以前  |  521240次阅读
Android 深色模式适配原理分析 4年以前  |  29634次阅读
Android阴影实现的几种方案 2年以前  |  12221次阅读
Android 样式系统 | 主题背景覆盖 4年以前  |  10293次阅读
 目录