我们对这种新的可能性感到兴奋无比,但却很难真的投入大量时间重新编写原有应用以充分发挥新型编程风格带来的种种潜力。然而,如果我们从全新项目起步,结果又会如何?我们能够向其中引入哪些突破性的思维?哪些解决方案可以带来理想的稳定性?我们是否应该广泛使用RxJava,并将响应式至上思路作为应用的结构指导?
Cycle.js库(来自André Staltz)对于响应式至上思维作出了很好的诠释: Cycle.js — Streams。
Rx具备良好的可组合特性,因此拥有巨大的发展潜力,然而,其与常规的面向对象编程风格又存在着显著区别。事实上,对于毫无RxJava使用经验的开发人员而言,其确实存在着难以理解的问题。
在开始新项目之前,我们面临着更多需要回答的问题。举例来说:
要为这些问题找到答案,我们需要首先创建一款小小应用,从而做出明智的决定。而这正是本文的内容所在——依托于整个流程得出有用的见解。如果大家希望了解更多细节,咱们马上进入主题。
关于这款应用
这次实验的目标在于创建一款应用,其能够下载用户所选定城市的相关天气数据,并将预报结果通过图形化图表的形式显示出来(再配上一些酷炫的动画)。要求很简单,但其中已经囊括了各类Android项目中会涉及到的大多数功能。
事实证明,coroutines与archtiecture components确实能够良好协作,并给我们带来能够顺利解决大量问题的整洁应用架构。
Cortoutines帮助我们以自然简洁的方式表达思路。如果大家希望代码能够逐行体现您所希望执行的确切逻辑(即使您可能也需要在其间进行一些异步调用),suspendable函数也能很好地完成任务。
另外需要强调的是:无需在回调之间往来跳转。在本示例应用当中,coroutines还彻底消除了对RxJava的依赖性。配合suspendable点的各函数在阅读及理解难度方面远低于部分RxJava运算符链——这些链可以快速实现函数化转换。
话虽如此,但我个人认为并不是在每个用例中都能将RxJava替换为coroutines。我们发现,observalbes就是一类无法被逐一映射为suspendable函数的表达类型。特别是如果observable运算符链允许多个事件从其中流经,且其中每个suspendable点只能在每次调用时恢复一次,则无法实现一对一映射。
回到我们这款天气应用中来:您可以查看其运作效果——但请注意,我并不是设计师,所以相关成果可能比较简陋。
图表动画显示您能够轻松利用简单的cortoutine以手动方式加以实现——其中不涉及任何ObjectAnimators、Interpolators、Evaluators或者PropertyValuesHolders等等。
最重要源代码片段已经展示如下。不过如果您希望查看完整项目,请参阅 GitHub。
代码量并不大,相信大家能够轻松完成浏览。
我将从网络层开始介绍这款应用的具体结构。接下来,我会探讨业务逻辑(在MainModel.kt文件中),其几乎不受限于Android系统平台。最后,则是UI部分(这显然仅适用于Android系统)。
为了方便起见,我在这里为总体架构图添加了文本参考编号。我会特别关注其中绿色元素——即suspendable函数与actors(一个actor实际上就是一种非常实用的coroutine builder)。
总体来讲,actor模型属于一种并行计算数学模型——我将在下一篇博文中就此展开详细探讨。
01天气服务
这项服务负责从Open Weather Map REST API处下载特定城市的天气预报数据。
在这里,我使用了一套来自Square的简单但强大的库——Retrofit。我猜如今的Android开发人员不会没听说过它,但对于那些尚未接触过的朋友,这里再解释几句:这是一套非常流行的Andoird平台HTTP客户端。其能够面向POJO执行网络调用与响应解析。这里我们直接使用典型的Retrofit配置。我还插入了Moshi转换器将JSON响应转换为数据类。