Android学Dart学习笔记第二十七节 异步编程

概览

Dart 库中充满了返回 Future 或 Stream 对象的函数。这些函数是异步的:它们在启动可能耗时的操作(如输入 / 输出)后就会返回,而不会等待该操作完成。

async 和 await 关键字支持异步编程,使你能够编写看起来与同步代码相似的异步代码。

Handling Futures

当你需要一个已完成的 Future 的结果时,你有两个选择:

  • 使用 async
  • await 使用Future API

使用 async 和 await 的代码是异步的,但它看起来很像同步代码。

下面是一些使用 await 来等待异步函数结果的代码。

复制代码
await lookUpVersion();

要使用 await,代码必须位于异步函数中 ------ 即标记为 async 的函数:

Future checkVersion() async {

var version = await lookUpVersion();

// Do something with version

}

尽管异步函数可能会执行耗时的操作,但它不会等待这些操作。相反,异步函数只会执行到遇到第一个 await 表达式为止。然后它会返回一个 Future 对象,仅在 await 表达式完成后才恢复执行。

使用 try、catch 和 finally 在使用 await 的代码中处理错误并进行清理:

复制代码
try {
  version = await lookUpVersion();
} catch (e) {
  // 对无法查询版本做出反应
}

你可以在异步函数中多次使用 await。例如,以下代码会三次等待函数的结果:

复制代码
var entrypoint = await findEntryPoint();
var exitCode = await runExecutable(entrypoint, args);
await flushThenExit(exitCode);

在 await 表达式中,表达式的值通常是一个 Future;如果不是,该值会被自动包装成一个 Future。这个 Future 对象表示一个返回某个对象的承诺。await 表达式的值就是那个被返回的对象。await 表达式会使执行暂停,直到该对象可用为止。

如果在使用 await 时遇到编译时错误,请确保 await 处于异步函数中。

例如,要在应用的 main () 函数中使用 await,main () 的函数体必须标记为 async:

声明Async函数

async 函数是其主体用 async 修饰符标记的函数。

在函数中添加 async 关键字会使其返回一个 Future。

例如,考虑这个返回 String 的同步函数:

复制代码
String lookUpVersion() => '1.0.0';

如果你将其改为异步函数(例如,因为未来的实现会很耗时),返回值将是一个 Future:

复制代码
Future<String> lookUpVersion() async => '1.0.0';

请注意,该函数体不需要使用 Future API。必要时,Dart 会创建 Future 对象。如果你的函数不需要返回有用的值,使其返回类型为 Future<void>即可。

Handling Streams

当你需要从流中获取值时,有两种选择:

・使用 async 和异步 for 循环(await for)。

・使用流 API

使用 await for 之前,要确保它能让代码更清晰,并且你确实希望等待流的所有结果。例如,你通常不应该在 UI 事件监听器中使用 await for,因为 UI 框架会发送源源不断的事件流。

异步 for 循环具有以下形式:

表达式的值必须具有 Stream 类型。执行过程如下:

等待流发出一个值。

执行 for 循环的主体,将变量设置为发出的值。

重复步骤 1 和 2,直到流关闭。

要停止监听流,你可以使用 break 或 return 语句,这会跳出 for 循环并取消对流的订阅。

如果在实现异步 for 循环时遇到编译时错误,请确保 await for 位于异步函数中。

相关推荐
alexhilton21 分钟前
Compose中的ContentScale:终极可视化指南
android·kotlin·android jetpack
盐水冰40 分钟前
【烘焙坊项目】后端搭建(12) - 订单状态定时处理,来单提醒和顾客催单
java·后端·学习
Hello小赵42 分钟前
视频压缩编码学习(一)—— 基础知识大集合
学习
左左右右左右摇晃1 小时前
计算机网络笔记整理
笔记·计算机网络
不吃西红柿的851 小时前
[职场] 内容运营求职简历范文 #笔记#职场发展
笔记·职场和发展·内容运营
似水明俊德2 小时前
02-C#.Net-反射-学习笔记
开发语言·笔记·学习·c#·.net
智者知已应修善业2 小时前
【51单片机独立按键控制数码管移动反向,2片74CH573/74CH273段和位,按键按下保持原状态】2023-3-25
经验分享·笔记·单片机·嵌入式硬件·算法·51单片机
adore.9682 小时前
3.18 复试学习
学习
C羊驼2 小时前
C语言:两天打鱼,三天晒网
c语言·经验分享·笔记·算法·青少年编程
留白_3 小时前
MySQL学习(9)——索引
学习