- 原文链接 : Flux and Android
互联网的浪潮让许多IT从业者走上创业的路,我就是其中一员。我最近加入了一个创业公司,并从零开始制作一个产品。过去我一直在做外包,所以很难有机会真正为一个应用实施某种架构或技术。但现在全权负责一个应用开发事务的机会就在我的手中,我对此很激动,也迫不及待要把我这些年通过不断的技术积累所完成的库以及架构模式应用到这个初生的应用之中。
去年的大部分时间我都在开发一个网页项目,而且没有太多的机会让自己保持学习Android方面的新技术。当时和我一起进行开发的团队用 AngularJS 进行开发,在项目的开发过程中,我们最看重的就是确保所有的代码模块能像乐高积木部件一样(低耦合,大量的依赖注入,只有在某种情况下才产生代码副作用)组装成最终的项目。这样写代码能极大程度让开发者在项目的迭代和需求更迭所带来的代码修改、重构中被解放,因此我想要保持这个习惯,并把这种编程思想应用到Android开发中。当然了,这肯定不容易,毕竟罗马不是一天就能建成的。
一番考量后,我决定从依赖注入入手,因为我知道不论是Java抑或是Android,依赖注入都有许多开源的库。但遗憾的是,依赖注入一直是我没有掌握得很好的知识点,所以我阅读了许多优秀的讨论:
而且读了一些优秀的博文:
最终我觉得 Dagger 2 会是最切合我的开发思路的依赖注入库,后来我又看了一些相关信息,还用 Butterknife 来对 View 进行注入。但现在最大的问题是,我找不到 Dagger 2 各方面相关的最佳用例(可能是 Dagger 2 还处于 Beta 版本的原因)。不过我还是找到了一丢丢的,虽说他们大部分都关注于如何将 Dagger 2 应用到项目中,而不是怎么在实际的 Android 应用被运用。
这些是我找到的一些用例:
在我想清楚我想用依赖注入干什么之后,我就开始想应该用一个怎样的软件架构去达到松耦合,并且能让 View 和业务逻辑相互独立(就像我在用 Angular 时做的那样)。实现这样的软件架构还有一个好处就是:简化测试驱动开发……因为如果模拟 Activity 对象和 View 对象只能够进行测试,并且给出相应的测试结果,这样的测试其实是没有什么意义的。
最终我决定使用的架构是 Flux。很显然,Facebook 开发Flux是为了将它应用到网页和javaScript 上,所以如果我想把它应用到Android项目中,就必须这个项目作一定程度的修改。经过一些调整(主要是 dispatcher 和 view 访问数据的方式),结合 Square 开发的 Otto 库,Android版的Flux架构库就诞生了。
后来我又想到了一些有用的东西,但我不敢把这些想法在这个阶段投入到应用的开发中。毕竟我现在使用的架构模式是没有经过测试的,而且我很不熟悉 Dagger 2,Butterknife 和 Otto 这些库,所以我决定以测试驱动的方式决定这些想法的实施。于是我遵循Facebook的用例(还有一些其他人的)创建了一个简单,但功能完备的应用,并把它命名为FluxyTodo。作为最想要看到这种架构模式成功的人,我想要用另一个有关如何组合使用Dagger 2,Butterknife和Otto的例子向所有关注的人证明这个架构的可行性。因为这些库的用例非常少,在功能完备的应用中更甚,我觉得我最终提供的用例肯定会成为Android开发社区的一笔财富。
因此,如果越多的人采用这种架构,Android开发就会变得没那么痛苦了。下面来看干货吧!
在看了 Flux 和尝试把相关概念应用到Android中后,我想到了这个架构,所以如果你以前有用过Flux的话,这部分的内容对你来说会非常熟悉。下面是基本的架构图:
如你所见,这和Flux非常相似,毕竟我只是基于Android进行了一点点的修改,主要的区别在于dispatcher的运作方式。没用创建一个dispatcher去模仿Facebook应用创建的行为,我用事件总线代替了这个机制(Otto)。还有一个细微的差别是:我使用了 models 和 stores,而不是只使用 stores。stores 只用于存储 View 的状态,而 models 存储其他应用数据和业务逻辑。
View层一般用于给用户显示界面,在Android系统中,View层的表示就是Activity和Fragment,及它们对应的xml组件。纯理论来看,View的职责只包含创建和显示呈现给用户的界面,并且监听用户在View上的操作并返回用户产生的交互行为。也就是说,在View层绝不应该存在任何数据操作或业务逻辑。View层的逻辑应该尽可能少地与View的状态产生交集。
当用户与View的某个区域产生交互,View应该将用户产生的动作交由操作事件产生部件进行处理。假如我们要正确地完成View中产生的动作的事件处理链,View则应该只与一个部件产生内部通信,即操作事件产生部件。举例来说把,假如一个用户点击了上传按钮,那么View应该让行为产生部件创建一个上传行为,以完成用户所需要完成的操作。
至于在View中填充控件及相关的数据,View则只应该监听一个数据源的状态,数据总线。一旦View被创建,View就应该订阅来自数据总线的事件,当数据总线流入View将用到的数据,View就应该取得该数据,并将它绑定到对应的控件中。
操作事件产生部件有两个职责:1、为View提供API,用以响应用户在View上可能产生的操作事件。例如你开发了一个计算器App,相应的操作事件产生部件就应该有 createAddAction, createSubtractAction 等方法,具体有哪些方法依赖于计算器的功能需求,当然了,这些方法可能会需要一个参数,例如 public void createAddAction(float numberToAdd)。
2、创建行为对象,并将它们投递到事件总线上。
事件总线是所有事件被投递、流动的部件,stores 和 models 监听投递到事件总线上的特定事件。当特定事件产生,就会触发它们处理View的逻辑或业务逻辑。
models用于数据的存储和转换,在我的架构中期时和传统的MVC模式中的models相似。models会订阅投递到事件总线的事件,还是以计算器为例子吧,如果一个加法运算的操作事件对象被投递到事件总线上,Model就会接收该事件,无论当前数字是多少,就会将作为参数传入的数字与当前数字进行加法运算,然后将运算结果投递到数据总线上。
而stores与models的不同之处在于:存储在store的数据与当前的View状态呈强相关关系,继续以计算器为例,此时你可以在store中存储一个操作事件的撤销缓冲区,因为此时数据不与应用的实际状态关联。再举个例子,如果你有一堆App,而且想要过滤掉某些App,那么此时你可以将过滤后的App列表放到store,而原来的App列表仍然在model中。
数据总线是所有model和store投递数据更新事件的地方,View订阅某些数据,并将数据投递到数据总线上,从而达到异步更新View数据的目的。
这个架构解耦了Android应用的所有组成部件,使Android开发变得更轻松。此外,以测试驱动开发和依赖注入也变得简单。
下面这张图列举了一些你可以在我的架构模式中使用的常被推荐来进行测试驱动开发的办法。该测试驱动开发的架构模板如下:
下面是一些使用本架构的人想在View中测试的东西:
对创建的每一个操作事件产生部件,你应该为每一个部件创建对应的操作事件,投递到事件总线中让部件的方法进行测试。而要完成这个工作,你只需要简单地调用部件的方法,监听事件总线以确保正确的操作事件对象被投递到事件总线中,并让它装载正确的数据。
models 和 stores 是应用的核心,因此,需要的测试是最多的。每一个model和store对象都应该进行充分的单元测试。对于没有监听操作事件或投递数据到数据总线上的简单对象,标准的单元测试就足够了。而监听操作事件、投递数据到数据总线上和具有某些业务逻辑的那些model和store,则需要在测试的时候关联对应的总线以完成测试。
为了将这个新的架构投入测试,我决定将它应用到一个简单的待办事项App中(绝对是我原创的)
下面这张架构图详细地说明了每一个部件是如何和其他部件交互的:
如果你想详细了解这个架构是怎么被应用的,可以到这里下载我开发的待办事项App源码进行学习。
尽管通过这个架构方式开发的App已经可以正常使用了(和用Facebook的Flux架构开发的待办事项App相似),我也挺满意实际的效果的。我想到了几个与服务器通信的新办法,感觉能应用到这个架构中,但这些办法我都不太满意。显然,我理想中的与服务器通信的办法,必须能在某些情况下能用某个方程表示,这也是我接下来要研究的东西。一旦我想到了一个满意的解决方案,我就会更新博客和大家分享!
京东创始人刘强东和其妻子章泽天最近成为了互联网舆论关注的焦点。有关他们“移民美国”和在美国购买豪宅的传言在互联网上广泛传播。然而,京东官方通过微博发言人发布的消息澄清了这些传言,称这些言论纯属虚假信息和蓄意捏造。
日前,据博主“@超能数码君老周”爆料,国内三大运营商中国移动、中国电信和中国联通预计将集体采购百万台规模的华为Mate60系列手机。
据报道,荷兰半导体设备公司ASML正看到美国对华遏制政策的负面影响。阿斯麦(ASML)CEO彼得·温宁克在一档电视节目中分享了他对中国大陆问题以及该公司面临的出口管制和保护主义的看法。彼得曾在多个场合表达了他对出口管制以及中荷经济关系的担忧。
今年早些时候,抖音悄然上线了一款名为“青桃”的 App,Slogan 为“看见你的热爱”,根据应用介绍可知,“青桃”是一个属于年轻人的兴趣知识视频平台,由抖音官方出品的中长视频关联版本,整体风格有些类似B站。
日前,威马汽车首席数据官梅松林转发了一份“世界各国地区拥车率排行榜”,同时,他发文表示:中国汽车普及率低于非洲国家尼日利亚,每百户家庭仅17户有车。意大利世界排名第一,每十户中九户有车。
近日,一项新的研究发现,维生素 C 和 E 等抗氧化剂会激活一种机制,刺激癌症肿瘤中新血管的生长,帮助它们生长和扩散。
据媒体援引消息人士报道,苹果公司正在测试使用3D打印技术来生产其智能手表的钢质底盘。消息传出后,3D系统一度大涨超10%,不过截至周三收盘,该股涨幅回落至2%以内。
9月2日,坐拥千万粉丝的网红主播“秀才”账号被封禁,在社交媒体平台上引发热议。平台相关负责人表示,“秀才”账号违反平台相关规定,已封禁。据知情人士透露,秀才近期被举报存在违法行为,这可能是他被封禁的部分原因。据悉,“秀才”年龄39岁,是安徽省亳州市蒙城县人,抖音网红,粉丝数量超1200万。他曾被称为“中老年...
9月3日消息,亚马逊的一些股东,包括持有该公司股票的一家养老基金,日前对亚马逊、其创始人贝索斯和其董事会提起诉讼,指控他们在为 Project Kuiper 卫星星座项目购买发射服务时“违反了信义义务”。
据消息,为推广自家应用,苹果现推出了一个名为“Apps by Apple”的网站,展示了苹果为旗下产品(如 iPhone、iPad、Apple Watch、Mac 和 Apple TV)开发的各种应用程序。
特斯拉本周在美国大幅下调Model S和X售价,引发了该公司一些最坚定支持者的不满。知名特斯拉多头、未来基金(Future Fund)管理合伙人加里·布莱克发帖称,降价是一种“短期麻醉剂”,会让潜在客户等待进一步降价。
据外媒9月2日报道,荷兰半导体设备制造商阿斯麦称,尽管荷兰政府颁布的半导体设备出口管制新规9月正式生效,但该公司已获得在2023年底以前向中国运送受限制芯片制造机器的许可。
近日,根据美国证券交易委员会的文件显示,苹果卫星服务提供商 Globalstar 近期向马斯克旗下的 SpaceX 支付 6400 万美元(约 4.65 亿元人民币)。用于在 2023-2025 年期间,发射卫星,进一步扩展苹果 iPhone 系列的 SOS 卫星服务。
据报道,马斯克旗下社交平台𝕏(推特)日前调整了隐私政策,允许 𝕏 使用用户发布的信息来训练其人工智能(AI)模型。新的隐私政策将于 9 月 29 日生效。新政策规定,𝕏可能会使用所收集到的平台信息和公开可用的信息,来帮助训练 𝕏 的机器学习或人工智能模型。
9月2日,荣耀CEO赵明在采访中谈及华为手机回归时表示,替老同事们高兴,觉得手机行业,由于华为的回归,让竞争充满了更多的可能性和更多的魅力,对行业来说也是件好事。
《自然》30日发表的一篇论文报道了一个名为Swift的人工智能(AI)系统,该系统驾驶无人机的能力可在真实世界中一对一冠军赛里战胜人类对手。
近日,非营利组织纽约真菌学会(NYMS)发出警告,表示亚马逊为代表的电商平台上,充斥着各种AI生成的蘑菇觅食科普书籍,其中存在诸多错误。
社交媒体平台𝕏(原推特)新隐私政策提到:“在您同意的情况下,我们可能出于安全、安保和身份识别目的收集和使用您的生物识别信息。”
2023年德国柏林消费电子展上,各大企业都带来了最新的理念和产品,而高端化、本土化的中国产品正在不断吸引欧洲等国际市场的目光。
罗永浩日前在直播中吐槽苹果即将推出的 iPhone 新品,具体内容为:“以我对我‘子公司’的了解,我认为 iPhone 15 跟 iPhone 14 不会有什么区别的,除了序(列)号变了,这个‘不要脸’的东西,这个‘臭厨子’。