Dart语言学习-异步编程async和await

前言

Dart是谷歌开发的计算机编程语言,它被用于web,服务器,移动应用等领域的开发,Dart亮相于2011年,2015年5月的Dart开发者峰会上,亮相了基于Dart语言的移动应用开发框架Sky,后更名为Flutter

img.jpg

async和await

前面我们使用Future,可以将时间加入到微任务队列和事件中去,从而异步执行,并且可以给注册回调拿到异步执行的结果,关键字asyncawaitDart语言支持异步的方式,使用他们可以不使用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 知识整理

你可能感兴趣的:(Dart语言学习-异步编程async和await)