前言
Dart
是谷歌开发的计算机编程语言,它被用于web
,服务器,移动应用等领域的开发,Dart
亮相于2011年,2015年5月的Dart
开发者峰会上,亮相了基于Dart
语言的移动应用开发框架Sky
,后更名为Flutter
async和await
前面我们使用Future
,可以将时间加入到微任务队列和事件中去,从而异步执行,并且可以给注册回调拿到异步执行的结果,关键字async
和await
是Dart
语言支持异步的方式,使用他们可以不使用Future
就可以编写异步代码
-
async
修饰的函数为异步函数,表示此函数中存在耗时操作并且需要对其异步处理 -
await
只能用在异步函数中,用来修饰耗时操作的部分,这部分会被加入到事件队列中,表示会等待异步方法执行 -
await
表示等待,会阻塞异步函数后续的执行,当await
引用的Future
执行完毕,await
后面开始执行
案例一
在程序开始启动时打印启动时间,加载图片,打印启动完成时间
- 打印启动时间不需要耗时,所以是同步的
- 加载图片需要耗时,所以需要异步
- 初始化某些参数配置不需要耗时,所以是同步的
首先我们创建下列方法
main()
printBootTime()
loadImg()
init()
我们需要在加载图片异步执行,不影响其他的启动流程
main() {
printBootTime();
loadImg(); //由于不影响后续其他的启动流程所以在此处调用异步函数不使用await
init();
}
printBootTime(){
print("启动时间"+DateTime.now().millisecondsSinceEpoch.toString());
}
loadImg() async{
print("开始加载图片");
await Future.delayed(new Duration(seconds: 3));
print("图片加载完成");
}
init(){
print("初始化参数");
}
打印结果
启动时间1624708372396
开始加载图片
初始化参数
//3秒后
图片加载完成
案例二
我们需要在加载图片异步执行,并且加载完成之后加载网络数据,不影响其他的启动流程
main() {
printBootTime();
loadImg();
init();
}
printBootTime(){
print("启动时间"+DateTime.now().millisecondsSinceEpoch.toString());
}
loadImg() async{
print("开始加载图片");
await Future.delayed(new Duration(seconds: 3));
print("图片加载完成");
await loadNetworkData();
}
loadNetworkData() async{
print("开始加载网络数据");
await Future.delayed(new Duration(seconds: 2));
print("网络数据加载完成");
}
init(){
print("初始化参数");
}
打印结果
启动时间1624708462181
开始加载图片
初始化参数
//3秒后
图片加载完成
开始加载网络数据
//2秒后
网络数据加载完成
案例三
使用HttpClient调取网络数据,并将结果打印
main() async{
HttpClientResponse res = await getBaiduData();//由于需要等待网络请求response,所以需要await
print(res.statusCode);
}
getBaiduData() async{
HttpClient client = HttpClient();
//client.getUrl返回一个Future
var request =await client.getUrl(Uri.http("www.baidu.com", ""));
//request.close返回一个Future
var response = await request.close();
return response;
}
打印结果
200
欢迎关注Mike的简书
Android 知识整理