使用 Kotlin 进行 Android 编程
by Pierre-Olivier Laurence, Amanda Hinchman-Dominguez, G. Blake Meike, Mike Dunn
第 8 章 使用例行程序的结构化并发 使用例行程序的结构化并发
本作品已使用人工智能进行翻译。欢迎您提供反馈和意见:translation-feedback@oreilly.com
在上一章中,我们介绍了一种新的异步编程范式--例程。在使用例行程序时,了解如何恰当地使用暂停函数非常重要;我们将在本章介绍这一主题。由于大多数程序都需要处理异常和取消异常,我们还将介绍这些主题--在这方面,你会发现例行程序也有自己的一套规则,你应该加以注意。
本章第一节介绍了悬浮函数的惯用用法。我们将以一个登山应用程序为例,比较两种实现方式:一种基于线程,另一种基于悬浮函数和例行程序。你将看到这种比较如何在某些情况下凸显出例行程序的强大功能。
与大多数移动应用程序一样,徒步旅行示例需要取消机制。 我们将介绍你需要了解的有关使用 coroutines 取消机制的所有知识。为了应对大多数情况,我们还将介绍并行分解和监督。使用这些概念,您就能在需要时实现复杂的并发逻辑。
最后,本章以对使用例行程序处理异常的讲解结束。
暂停功能
想象一下,您正在开发一款应用程序,帮助用户规划、计划、跟踪、绘制和共享有关远足的信息。 您的用户应该能够浏览他们已经完成或正在进行的任何远足活动。在外出远足之前,一些基本的统计信息非常有用,比如
-
总距离
-
最后一次远足的时间和距离
-
他们选择的路线沿途的当前天气
-
最喜欢的远足
这种应用需要客户端和服务器之间就气象数据和用户信息进行各种交互。我们该如何为这样的应用选择数据存储方式?
我们可以选择将这些数据存储在本地供日后使用,或者存储在远程服务器上(这被称为持久性策略)。运行时间较长的任务,尤其是 Network+ 或 IO 任务,可以通过后台作业来实现,比如从数据库、本地文件或 protobuf 中读取数据;或查询远程服务器。就其核心而言,从主机设备读取数据永远比从网络读取相同数据要快。
因此,根据查询的性质,检索数据的速度可能会有所不同。我们的工作逻辑必须具有足够的弹性和灵活性,以便在这种情况下提供支持和生存,并且能够应对我们无法控制甚至无法意识到的情况。
设置场景
您需要开发一项功能,让用户可以检索他们最喜欢的远足路线以及每条路线的当前天气。
我们已经提前提供了本章开头所述应用程序的一些库代码。 下面是已经提供给您的一组类和函数:
dataclassHike(valname:String,valmiles:Float,valascentInFeet:Int)classWeather// Implementation removed for brevitydataclassHikeData(valhike:Hike,valweather:Weather?)
Weather 不是一个 Kotlin 数据类,因为我们需要为 的天气属性类型命名(如果我们将 声明为数据类而不提供属性,代码将无法编译)。HikeData Weather
Hike ,在这个例子中只是:
-
一个名字
-
总里程数
-
总上升高度(英尺
HikeData 将Hike 对象与可归零的 Weather 实例配对(如果我们因某种原因无法获取天气数据)。
我们还获得了一些方法,可以根据用户 ID 获取Hike 的列表以及远足的天气数据:
funfetchHikesForUser(userId:String):List<Hike>{// implementation removed for brevity ...