写在前面
了解过Flutter的同学都知道,不同于 Android 原生开发,dart 是单线程实体的语言,所以我们一般的异步操作,实际上还是通过单线程通过调度任务优先级来实现的,就是我们经常用到的 Future,但是Flutter中的事件机制究竟是怎样的?多个Future 和 Microtask 程序的执行顺序是怎样的? 本文将借助两个比较复杂的例子来详细介绍 Flutter 的事件机制,希望能对大家有所帮助。
Main代码块,EventQueue,MicrotaskQueue 的执行优先级
首先我得提一嘴 isolate(隔离),isolate是有自己的内存和单线程控制的运行实体,isolate类似于线程。 运行中的 Flutter 程序由一个或多个 isolate 组成。我们的代码默认都在 Main isolate中执行。
为了保持高的响应性,特别耗时的任务一般不要放在Main isolate 中。但 isolate 不是本文的重点,在此就不过多赘述。
Dart 中事件机制的实现 :Main isolate 中有一个Looper,但存在两个Queue:Event Queue 和 Microtask Queue 。
因为 isolate 是单线程实体,所以 isolate中的代码是按顺序执行的。
所以 dart 中的代码执行优先级可以分为三个级别:
- 在 Main 中写代码将最先执行;
- 执行完 Main 中的代码,然后会检查并执行 Microtask Queue 中的任务,
通常使用 scheduleMicrotask 将事件添加到 MicroTask Queue 中; - 最后执行 EventQueue 队列中的代码,通常使用 Future