我们知道Dart中有一个事件循环(Event Loop)来执行我们的代码,里面存在一个事件队列(Event Queue),事件循环不断从事件队列中取出事件执行。

但是如果我们严格来划分的话,在Dart中还存在另一个队列:微任务队列(Microtask Queue)。

  • 微任务队列的优先级要高于事件队列;

那么在Flutter开发中,哪些是放在事件队列,哪些是放在微任务队列呢?

  • 所有的外部事件任务都在事件队列中,如IO、计时器、点击、以及绘制事件等;
  • 而微任务通常来源于Dart内部,并且微任务非常少。这是因为如果微任务非常多,就会造成事件队列排不上队,会阻塞任务队列的执行(比如用户点击没有反应的情况);

image.png

1 创建微任务

在开发中,我们可以通过dart中async下的scheduleMicrotask来创建一个微任务:

  1. import 'dart:async';
  2. void main(List<String> args) {
  3. print("main start");
  4. // 事件队列
  5. Future.value("hello event").then((val) {
  6. print(val);
  7. });
  8. // 微任务队列
  9. scheduleMicrotask(() {
  10. print("hello Microtask");
  11. });
  12. print("main end");
  13. }

输出结果:

main start main end hello event hello Microtask // 为什么微任务队列 Exited

2 Future的代码是加入到事件队列还是微任务队列呢?

  1. import 'dart:async';
  2. void main(List<String> args) {
  3. print("main start");
  4. // Future会放在事件队列中
  5. Future(() {
  6. print("hello1");
  7. });
  8. // Future.value会放在微任务队列
  9. Future.value("hello2").then((val) {
  10. print(val);
  11. });
  12. // Future.microtask会放在微任务队列
  13. Future.microtask(() {
  14. print("hello3");
  15. });
  16. // Future.sync会同步执行, 即在本事件循环内直接完成
  17. Future.sync(() {
  18. print("hello4");
  19. });
  20. print("main end");
  21. }

输出结果:

main start hello4 main end hello2 hello3 hello1 Exited