了解过Flutter的同窗都知道,不一样于 Android 原生开发,dart 是单线程实体的语言,因此咱们通常的异步操做,实际上仍是经过单线程经过调度任务优先级来实现的,就是咱们常常用到的 Future,可是Flutter中的事件机制到底是怎样的?多个Future 和 Microtask 程序的执行顺序是怎样的? 本文将借助两个比较复杂的例子来详细介绍 Flutter 的事件机制,但愿能对你们有所帮助。git
首先我得提一嘴 isolate(隔离),isolate是有本身的内存和单线程控制的运行实体,isolate相似于线程。 运行中的 Flutter 程序由一个或多个 isolate 组成。咱们的代码默认都在 Main isolate中执行。
为了保持高的响应性,特别耗时的任务通常不要放在Main isolate 中。但 isolate 不是本文的重点,在此就不过多赘述。github
Dart 中事件机制的实现 :Main isolate 中有一个Looper,但存在两个Queue:Event Queue 和 Microtask Queue 。
由于 isolate 是单线程实体,因此 isolate中的代码是按顺序执行的。
因此 dart 中的代码执行优先级能够分为三个级别:
bash
总结:Dart 中事件的执行顺序:Main > MicroTask > EventQueue。
如图:app
void testSX(){
new Future(() => print('s_1'));
scheduleMicrotask(() => print('s_2'));
print('s_3');
}
复制代码
输出结果:异步
I/flutter (32415): s_3
I/flutter (32415): s_2
I/flutter (32415): s_1
复制代码
前面讲到,用 async 和 await 组合,便可向 event queue 中插入 event 实现异步操做,那为何还会有Future呢?
其实,Future 最主要的功能就是提供了链式调用。async
new Future (() => print('拆分任务_1'))
.then((i) => print('拆分任务_2'))
.then((i) => print('拆分任务_3'))
.whenComplete(()=>print('任务完成'));
复制代码
Future中的 then 并无建立新的Event丢到Event Queue中,而只是一个普通的Function,在一个 Future 全部的 Function 执行完后,下一个 Future 才会开始执行。oop
理论结束,而后来看一段代码吧:ui
void testFuture() {
Future f1 = new Future(() => print('f1'));
Future f2 = new Future(() => null);
Future f3 = new Future.delayed(Duration(seconds: 1) ,() => print('f2'));
Future f4 = new Future(() => null);
Future f5 = new Future(() => null);
f5.then((_) => print('f3'));
f4.then((_) {
print('f4');
new Future(() => print('f5'));
f2.then((_) {
print('f6');
});
});
f2.then((m) {
print('f7');
});
print('f8');
}
复制代码
各位同窗能够试着写一下结果,而后对比下输出结果。spa
输出结果:线程
com.example.flutter_dart_app I/flutter: f8
com.example.flutter_dart_app I/flutter: f1
com.example.flutter_dart_app I/flutter: f7
com.example.flutter_dart_app I/flutter: f4
com.example.flutter_dart_app I/flutter: f6
com.example.flutter_dart_app I/flutter: f3
com.example.flutter_dart_app I/flutter: f5
com.example.flutter_dart_app I/flutter: f2
复制代码
是否是跟本身的结果截然不同,别急,看我来慢慢分析: 分析:
是否是有点理解不了,没事,牢记四个规则,本身再算一遍,相信你就了然于胸了。重要要在脑海里有一个 EventQueue 的队列模型,牢记先进先出。
而后来试一试下一题:
void testScheduleMicrotatsk() {
scheduleMicrotask(() => print('Mission_1'));
//注释1
new Future.delayed(new Duration(seconds: 1), () => print('Mission_2'));
//注释2
new Future(() => print('Mission_3')).then((_) {
print('Mission_4');
scheduleMicrotask(() => print('Mission_5'));
}).then((_) => print('Mission_6'));
//注释3
new Future(() => print('Mission_7'))
.then((_) => new Future(() => print('Mission_8')))
.then((_) => print('Mission_9'));
//注释4
new Future(() => print('Mission_10'));
scheduleMicrotask(() => print('Mission_11'));
print('Mission_12');
}
复制代码
你们能够先本身试一下,再对照结果~
输出结果:
I/flutter (19025): Mission_12
I/flutter (19025): Mission_1
I/flutter (19025): Mission_11
I/flutter (19025): Mission_3
I/flutter (19025): Mission_4
I/flutter (19025): Mission_6
I/flutter (19025): Mission_5
I/flutter (19025): Mission_7
I/flutter (19025): Mission_10
I/flutter (19025): Mission_8
I/flutter (19025): Mission_9
Syncing files to device MIX 3...
I/flutter (19025): Mission_2
复制代码
是否是仍是没答全对?不要紧,很正常,看我慢慢道来:
分析:
看到这里,相信各位同窗已经对 Dart 事件机制有一个大概的了解,但愿能对 各位在学Flutter 的同窗有所帮助,蟹蟹~
我是雷加,若是您喜欢个人文章,请留下你的赞;若有疑问和建议,请在评论区留言
个人 Github, 欢迎关注~