Dart中的异步与事件循环

flutter异步 多线程,比如Java、C++,我们普遍的做法是开启一个新的线程(Thread),在新的线程中完成这些异步的操作,再通过线程间通信的方式,将拿到的数据传递给主线程。3、网络请求成功后,会执行then中传入的回调函数,这也是一个事件,该事件被放入到事件循环中执行,执行完毕后,事件循环将其丢弃。1、当用户发生点击的时候,onPressed回调函数被放入事件循环中执行,执行的过程中发送了一个网络请求。2、网络请求发出去后,该事件循环不会被阻塞,而是发现要执行的onPressed函数已经结束,会将它丢弃掉。 阅读详情

前言

Dart作为Flutter的开发语言,了解Dart的机制是必可少的。本篇文章就介绍一下Dart的异步操作与事件循环机制。

异步操作我们都知道在开发过程中,如果有耗时操作,我们一般都会使用异步任务解决,以防主线程卡顿。

事件循环是Dart中处理事件的一种机制。Flutter中就是通过事件循环来驱动程序的运行,这点与Android中的Handler有点类似。

Dart的事件循环机制

Dart语言是单线程模型的语言。这也就意味着Dart在同一时刻只能执行一个操作,其他操作在这个操作之后执行。那么Dart的其他操作如何执行呢?在Dart中通过Event Loop来驱动事件的执行。

  • Dart程序启动时会创建两个队列,分别是MicroTak队列(微服务队列)和Event队列(事件队列);
  • 然后执行main()方法;
  • 最后启动事件循环;

[外链图片转存失败(img-vcqDcb9e-1568027789488)(E:\Blog\Image\dart-eventLoop.png)]

上面的图片描述了Dart的事件循环机制。可以看到,Dart执行事件的流程是:

  1. 执行main();
  2. 执行MicroTask队列中事件;
  3. 执行事件队列中的事件;

可以看到,main()方法的优先级最高,执行结束后,才执行两个队列中事件。其中MicroTask队列的优先级又高于Event队列的优先级。

MicroTask队列和Event队列

MicroTask 队列适用于非常简短且需要异步执行的内部动作或者想要在Event执行前做某些操作,因为在MicroTask执行完以后,还需要执行Event队列中事件。

在使用Dart时异步事件应该优先考虑使用Event队列。

Dart中的异步

Future

Future 是一个异步执行并且在未来的某一个时刻完成(或失败)的任务。每一个Future都会执行一个事件并且将事件加入到Event队列中去。

factory Future(FutureOr<T> computation()) {
    _Future<T> result = new _Future<T>();
    Timer.run(() {
      try {
        result._complete(computation());
      } catch (e, s) {
        _completeWithErrorCallback(result, e, s);
      }
    });
    return result;
  }

从上面Future的构造函数代码可以看到,通过Timer的run()方法将运算过程发送到事件队列中去,然后通过_complete()方法获取了提交给Future的运算结果,最终返回一个Future对象。

void main(){
    print('Before the Future');
    Future((){
        print('Running the Future');
    }).then((_){
        print('Future is complete');
    });
    print('After the Future');
    Future<String>.microtask(() {
        return "microtask";
  	}).then((String value) {
    	print(value);
  	});
}

以上代码的运行结果是:

Before the Future
After the Future
microtask
Running the Future
Future is complete

可以看到,这里先执行的是main()方法中的打印信息,然后打印了microtask,最后才执行了Future。这里也可以证明Future是在事件队列中执行的。

async、await关键字

async与await关键字配合使用可以更加优雅的处理dart中的异步。对于有async修饰的函数来说,它会同步执行函数中的代码,直到遇到第一个await关键字,然后将await修饰的代码提交到事件队列中处理,在await修饰的代码执行完毕后会立即执行剩下的代码,而剩下的代码将在微任务队列中执行。

void methodAsync() async {
  sleep(Duration(seconds: 1));
  Future<String>(() {
    return "future 1";
  }).then((String value) {
    print(value);
  });
  print("async start");
  await microTaskAndEvent(); //输出一个微任务打印 microtask 以及一个事件队列任务打印 futrue
  print("async end");
}

void main() {
    methodAsync();
  	print("Hello World");
}

以上代码的输出结果是:

async start
Hello World
microtask
async end
future 1
future

从打印结果可以看出,

  • 这里同步执行methodAsync()方法,即使在睡眠1s的情况下,也首先输出了async start;然后输出Hello World;
  • 接下来执行了一个Future1,然后执行await关键字后面的函数;
  • microTaskAndEvent()方法包括一个微任务和事件。这里可以看到打印了microtask接着打印了async end,这里可以证明async在await关键字之后的代码是放到微任务中执行的。
  • 最后打印了事件队列中的任务。

Isolate

Isolate从名称上理解是独立的意思。在dart中,Isolate有着自己的内存并且不存在通过共享内存的方式实现Isolate之间的通信,同时Isolate是单线程的计算过程。

Isolate的特点与使用:

  • Isolate有着自己的内存并且不存在通过共享内存的方式实现Isolate之间的通信;
  • 每个Isolate都有自己的事件循环;
  • 在Isolate中是通过Port进行通信的。Port分为两种一种是receive port用于接收消息。另外一种是send port用于发送消息;
  • 使用Isolate时,可以通过spwan()方法启动一个Isolate

接下来通过一个例子展示Isolate的通信以及创建过程。

main() async {
  var receivePort = new ReceivePort();
  /**
    * 初始化另外一个Isolate,
    * 将main isolate的send port发送到child isolate中,
    * 用于向main isolate发送信息
    */
  await Isolate.spawn(echo, receivePort.sendPort);

  // child isolate的第一个信息作为child isolate的send port,由于向child isolate发送信息
  var sendPort = await receivePort.first;

  var msg = await sendReceive(sendPort, "hello");
  print('received $msg');
  msg = await sendReceive(sendPort, "close");
  print('received $msg');
}

// child isolate的入口
echo(SendPort sendPort) async {
  // 打开一个接收端口
  var port = new ReceivePort();
  //监听接收的信息
  port.listen((dynamic msg) {
    print("child receive $msg");
    var data = msg[0];
    SendPort replyTo = msg[1];
    replyTo.send(data);
    if (data == "close") port.close(); //关闭接收端口
  });

  // 向其他的isolate通知child isolate的发送端口.
  sendPort.send(port.sendPort);
}
//发送信息
Future sendReceive(SendPort port, msg) {
  ReceivePort response = new ReceivePort();
  port.send([msg, response.sendPort]);
  return response.first;
}

总结

以上就是关于Dart的异步以及事件循环原理。理解这些内容是必要的,因为在很多的开发场景都会用到异步,同时需要很好的理解Dart的事件处理机制。

flutter 必须知道的Dart中线程设计以及异步的实现 前言 做过Android原生开发的同学都知道,在安卓原生开发中有主线程(也叫UI线程)和工作线程的概念,诸如像网络请求、IO操作等的耗时操作,为了避免产生ANR(应用程序无响应)我们都会放到单独创建的工作线程中去处理,这样一来负责UI渲染的主线程的运行就不受影响了,用户看到的界面也就不会有任何的卡顿挂起了,另一方面Android原生中系统要求所有UI的更新是必须在主线程中完成的,因此如果工作线程中的某个操作需要更新UI界面,我们必须通知给主线程去完成,一旦直接在工作线程中去更新UI则会报异常,因此在Andr 阅读详情

相关推荐

机械臂控制的基础知识

在现代工业中,机械臂的自动化控制已经成为智能制造的重要一环。控制机械臂涉及多个学科,包括机械设计、运动学、控制理论和编程等。本文将从以下几个方面介绍机械臂控制的核心知识点:机械臂的构成、运动学分析、动力学建模、控制方法及编程实现。

qq_45728381的博客 5470

Flutter异步与事件监听

如果想要成为架构师或想突破20~30K薪资范畴,那就不要局限在编码,业务,要会选型、扩展,提升编程思维。此外,良好的职业规划也很重要,学习的习惯很重要,但是最重要的还是要能持之以恒,任何不能坚持落实的计划都是空谈。如果你没有方向,这里给大家分享一套由阿里高级架构师编写的《Android八大模块进阶笔记》,帮大家将杂乱、零散、碎片化的知识进行体系化的整理,让大家系统而高效地掌握Android开发的各个知识点。

star_nwe的博客 885

SLAM算法的优缺点

SLAM(Simultaneous Localization and Mapping,同时定位与地图构建)算法是一种通过传感器数据实时估计机器人自身位置和构建环境地图的技术。

selenia8860的博客 2907

Dart的基本语法之异步

Dart的基本语法之异步async和awaitFutureFuture中异常的使用多个Future的执行顺序 async和await await关键字只能在加上async关键字的方法里使用,而且执行完await的代码后会立即返回出方法,await下面的代码要等到主函数里面的非异步代码执行完毕后再执行。下面来个经典例子: void main() { getName1(); getName2(); getName3(); } getName1() async { await getStr();

u011170793的博客 581

SAP HR模块配置假期日历和缺勤类型

SAP的HR模块。业务顾问在实施时一般会配置未来10年的假期日历,到期后再进行配置。同时,增加请假类型(缺勤信息类型)。记录这一过程。

福来阁86号技师的妖孽日常 5525

深入解析ISO12233标准:SFR算法从理论到代码实现

本文深入解析ISO12233标准中的SFR算法,从理论到代码实现全面介绍如何量化成像系统的解析力。通过e-SFR算法测量边缘扩散函数(ESF)和空间频率响应(SFR),结合光学原理和实际代码示例,帮助开发者准确评估影像质量。文章包含关键步骤的Python实现和工程优化技巧,适用于相机测试、镜头评估等应用场景。

weixin_29200485的博客 156

flutter入门之dart中的并发编程、异步和事件驱动详解

在java开发中,我们进行并发编程的时候,经常会使用future来处理任务,获取返回的结果,或者延迟处理任务等操作,而在dart中,我们执行一个任务同样也可以使用future来处理,而Future默认情况下执行的是一个event-queue任务,也就是和我们正常执行的业务逻辑一样的任务级别,然而future提供了多个api和特性来完成任务队列的使用,例如我们在js开发的时候经常使用ajax的then函数进行回调,then中的参数即为当前任务执行完的参数,我们可以在。isolate自身的任务又是如何处理的?

Dream It Possible 1979

华为非AI方向0603笔试真题-爆破小游戏(详细思路+多语言题解)

华为非AI方向0603笔试第二题【爆破小游戏】,提供详细思路讲解以及代码实现。

qq_45776114的博客 358

Dart 学习笔记三(异步编程)

目录类 类

EvanHc的博客 823

CasADi - 最优控制开源 Python/MATLAB 库

CasADi 是一款开源软件工具,用于数值优化,特别是最优控制(即涉及微分方程的优化)。该项目由 Joel Andersson 和 Joris Gillis 在鲁汶工程大学工程优化中心 (OPTEC) 在读博士生在 Moritz Diehl 的指导下发起。本文档旨在简要介绍 CasADi。

机器人控制与仿真应用 7935

RK3588芯片CAN总线调试秘籍:SocketCAN与错误帧攻略

RK3588芯片在嵌入式领域凭借8nm工艺和强大性能成为核心控制器。本文详细介绍了其CAN总线配置流程,包括硬件连接、内核驱动配置及SocketCAN命令操作,并深入解析了CAN通信中的错误帧机制及分析方法。通过智能工厂案例,展示了从问题定位到解决方案的全过程,强调了稳定通信对工业应用的重要性。文章为RK3588的CAN总线应用提供了实用技术参考,并对未来智能诊断技术在该领域的应用进行了展望。

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 518

Flutter - Dart事件循环机制与异步

欢迎关注微信公众号:FSA全栈行动 ???? 一、Dart 异步 与 JavaScript 一样, Dart 是基于 事件循环机制 的 单线程模型, 所以 Dart 中没有多线程, 也就没有主线程与子线程之分. 1、同步与异步 同步: 同一线程中, 按照代码的编写顺序, 自上而下依次执行 (直观感受: 需要等待) 异步: 代码执行中, 某段代码的执行不会影响后面代码的执行 (直观感受: 无需等待) 2、单线程模型 单线程模型: 一条执行线上, 同时且只能执行一个任务(事件), 其他任务都必须在后面排

GitLqr的博客 1147

使用R语言获取泊松回归模型的事件密度比(Incidence Rate Ratio,IRR)的95%置信区间

在泊松回归模型中,我们通常关注的是自变量对事件发生率的影响,而事件密度比(Incidence Rate Ratio,IRR)可以帮助我们理解不同自变量对事件发生率的相对影响。在本文中,我们将使用R语言来获取泊松回归模型所有系数的事件密度比的95%置信区间。通过以上步骤,我们可以使用R语言获取泊松回归模型所有系数的事件密度比的95%置信区间。为了获取事件密度比的置信区间,我们将使用。使用R语言获取泊松回归模型的事件密度比(Incidence Rate Ratio,IRR)的95%置信区间。

BugCrusher的博客 1264

Dart【00】异步Future与事件循环Event Loop

如果你的程序中有两个方法,这两个方法桉顺序执行,第一个方法执行需要五秒,如果是同步代码,第二个方法会等待第一个方法执行完,才会被调用,如果第一个方法是异步的,程序在执行第一个方法时,不会等待它执行结束,而是接着执行第二个方法,这样第二个方法就无需在第一个方法执行完之后被调用。在客户端异步是非常有用的,如果你在初始化时有一个非常耗时,但又不需要它在ui画面响应前执行完成的方法,你就可以使用异步。你现在应该了解Dart的事件循环以及dart如何安排任务。

JackWu blog 1961

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

深入解析Dart异步机制与Flutter事件循环

异步编程是现代应用开发的核心概念,特别是在单线程UI框架中尤为关键。Dart语言通过事件循环(Event Loop)机制实现非阻塞异步操作,其核心组件包括事件队列(Event Queue)和微任务队列(Microtask Queue)。这种机制使得Flutter应用能在主线程不被阻塞的情况下处理I/O操作和网络请求,确保UI流畅性。理解Future和async/await的工作原理对开发高性能Flutter应用至关重要,它们本质上是将回调函数封装成更易读的语法糖。在实际开发中,合理使用Microtask可以

weixin_33226548的博客 88

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Dart 异步机制深度解析:从 Isolate 到事件循环的完整架构

text│ Dart 异步架构全景 ││ │ • 代码执行单元 │◄───│ • 系统线程 │◄───│ • Flutter任务 │ ││ │ • 事件循环 │ │ • 线程池管理 │ │ 调度单元 │ ││ │ • 内存隔离 │ │ • 线程复用 │ │ • 专用线程 │ │。

2501_93078354的博客 688

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

循环中需要调用异步怎么确保执行完再执行其他的_彻底搞定Dart的异步

彻底搞懂Dart的异步前言一:接下来一段时间我会陆续更新一些列Flutter文字教程更新进度: 每周至少两篇;更新地点: 首发于公众号,第二天更新于掘金、思否等地方;更多交流: 可以添加我的微信 372623326,关注我的微博:coderwhy希望大家可以 帮忙转发,点击在看,给我更多的创作动力。前言二:在写这篇文章之前,我一直在犹豫,要不要在这里讲解Dart的异步相关话题,因为这部分...

weixin_39567222的博客 1442

flutter doctor一直等待_Flutter 之 Dart异步操作

一. Dart的异步模型我们先来搞清楚Dart是如何搞定异步操作的1.1. Dart是单线程的1.1.1. 程序中的耗时操作开发中的耗时操作:在开发中,我们经常会遇到一些耗时的操作需要完成,比如网络请求、文件读取等等;如果我们的主线程一直在等待这些耗时的操作完成,那么就会进行阻塞,无法响应其它事件,比如用户的点击;显然,我们不能这么干!!如何处理耗时的操作呢?针对如何处理耗时的操作,不同的语言有不...

weixin_39631953的博客 664

异步通信在生活中的例子_Flutter(五)之彻底搞懂Dart异步

彻底搞懂Dart的异步前言一:接下来一段时间我会陆续更新一些列Flutter文字教程更新进度: 每周至少两篇;更新地点: 首发于公众号,第二天更新于掘金、思否等地方;更多交流: 可以添加我的微信 372623326,关注我的微博:coderwhy 希望大家可以 帮忙转发,点击在看,给我更多的创作动力。前言二:在写这篇文章之前,我一直在犹豫,要不要在这里讲解Dart的异步相关话题,因为这部分内容很容...

weixin_31208627的博客 258

异步通信在生活中的例子_Flutter 之彻底搞懂Dart异步

彻底搞懂Dart的异步前言一:接下来一段时间我会陆续更新一些列Flutter文字教程更新进度: 每周至少两篇;更新地点: 首发于公众号,第二天更新于掘金、思否等地方;希望大家可以 帮忙转发,点击在看,给我更多的创作动力。前言二:在写这篇文章之前,我一直在犹豫,要不要在这里讲解Dart的异步相关话题,因为这部分内容很容易让初学者望而却步:1、关于单线程和异步之间的关系,比较容易让人迷惑,虽然我一定会...

weixin_35838019的博客 284

Flutter学习-Dart异步

Flutter学习-Dart异步

yong_19930826的博客 908

Flutter异步async操作--事件循环EventLoop机制

事件循环Event Loop机制文章参考一、实现异步的方式二、异步操作不是多线程1、Dart异步操作不是多线程为什么不卡(1)什么叫做卡(2)多线程(Multithreading)解决思路(3)Dart解决思路2、一个线程如何处理网络操作,等待的情况(1)事件循环(Event Loop)(2)事件队列(Event Queue)(3)Microtask Queue三、单进程存在问题四、总结 文章参考 B站UP主(王叔不秃) 一、实现异步的方式 void _incrementCounter() async

wang_hang_的博客 866

Dart异步处理机制

Dart异步处理机制(1小时)Dart的异步处理机制概览Dart与事件循环基本概念任务调度任务执行顺序事件队列微任务队列练习测试多核CPU的利用 Dart的异步处理机制概览 不同操作语言处理耗时任务有不同的处理机制: 多线程,开启一个新的线程,在新线程中进行异步操作,在通过线程间通信,将数据同主线程共享。Java和C++使用这种方式。 单线程+事件循环,JavaScript和Dart就是甩这种方...

S.H.的部落格林 868

Flutter-Dart异步和网络请求

Dart异步和网络请求

a1204942755的博客 3230

Flutter开发之Dart线程与异步

谈到异步,可能大家多会想到多线程,然而Dart是基于事件循环机制的单线程模型。单线程?嗯哼,也就是说在Dart的世界里没有多线程之说,当然也没有了所谓的主线程和子线程之分。

专注于移动互联网 4402

dart 07.1Dart执行模型

Dart 是一种单线程语言 首先我们需要记住 ​ Dart 是单线程的并且Flutter依赖于Dart 重点 Dart 同一时刻只执行一个操作,其他操作在该操作之后执行,这表示只要一个操作正在执行它就不会被其他代码中断 同样的如果该操作需要消耗一段时间,那么在操作执行期间应用将被阻塞 Dart 执行模型 那么,Dart 是如何管理事件执行呢 看下dart的 事件循环机制 当启动一个Flutter/Dart 程序时 将创建启动一个新的线程或者进程Dart中叫Isolate这个Iolate 将作

Applicaton的专栏 727
上一篇: Android高效开发(一)—合理使用图片资源
下一篇: Service组件概览学习
Coding-ls
博客等级 码龄11年 41粉丝 61原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值