Flutter事件循环(Event loop)
前言
在学习flutter的路上困难重重,本人通过相关知识的视频和文章进行整理,方便各位同学学习。
一、什么是Event loop?
Flutter程序从main()开始运行,一般执行完全部的代码就会自动退出。可是代码一下就执行完成了。但是app不可能执行了一秒就自动退出了,这个时候就要用到事件循环里面的循环了,保证代码一直在循环,不会轻易的结束。主要任务就是不停的检查,一个叫做“Event Queue(事件队列)”的东西,所以所谓的异步操作,实际上就是在“Event Queue”上添加事件来完成的。
除了“Event Queue”,还有一个优先级更高的“Microtask Queue”,存在的意义就是只要“Microtask Queue”里面还有事件没有处理完成,那么“Event Queue”就不被执行,只有到全部的“MicrotaskQueue”都被执行完了,才有机会来执行“Event Queue”。“Microtask Queue”一般是dart自己来处理,尽量不要去干扰它,而且在flutter引擎里面也有大量的事件是用“Event Queue”。所以如果一直往“Microtask Queue”里面挤,那flutter自己的有些事件也不会被执行。 总结一下就是
二、玩转Event loop
当我们需要运用到不同的通道来处理业务逻辑的时候,可以通过使用不同代码的优先级来控制业务逻辑
1.直接运行 ——在main函数中直接运行
Future.sync()
Future.value()
_.then()
代码如下(示例):
Future.sync(() => print("sync 1"));
Future.value(getName());
print("main2");
String getName (){
print("get name ");
return 'bob';
}
输出:I/flutter ( 3106): sync 1
I/flutter ( 3106): get name
I/flutter ( 3106): main2
2.Microtask队列
scheduleMicrotask()
Future.microtask()
_completed.then()
代码如下(示例):
scheduleMicrotask(() => print("microtask 1"));
Future.microtask(() => print("microtask 2"));
Future.value(123).then((value)=>print("Microtask 3"));
print("main1");
Future.sync(() => print("sync 1"));
Future.value(getName());
print("main2");
String getName (){
print("get name ");
return 'bob';
}
输出:I/flutter ( 3106): main1
I/flutter ( 3106): sync 1
I/flutter ( 3106): get name
I/flutter ( 3106): main2
I/flutter ( 3106): microtask 1
I/flutter ( 3106): microtask 2
I/flutter ( 3106): Microtask 3
3.Event队列
Future
Future.delayed()
代码如下(示例):
Future.delayed(Duration(seconds:1),()=> print("event 3"));
Future(()=> print("event 1"));
Future.delayed(Duration.zero,()=>print("event 2"));
scheduleMicrotask(() => print("microtask 1"));
Future.microtask(() => print("microtask 2"));
Future.value(123).then((value)=>print("Microtask 3"));
print("main1");
Future.sync(() => print("sync 1"));
Future.value(getName());
print("main2");
String getName (){
print("get name ");
return 'bob';
}
输出:I/flutter ( 3106): main1
I/flutter ( 3106): sync 1
I/flutter ( 3106): get name
I/flutter ( 3106): main2
I/flutter ( 3106): microtask 1
I/flutter ( 3106): microtask 2
I/flutter ( 3106): Microtask 3
I/flutter ( 3106): event 1
I/flutter ( 3106): event 2
I/flutter ( 3106): event 3
4.then()补充
有细心的同学发现 __then 不是直接运行嘛 ,为什么是在Microtask队列
_.then
_completed.then()
代码如下(示例):
Future.delayed(Duration(seconds: 1),()=>print("delayed"))
.then((value){
scheduleMicrotask(()=> print("micro"));
print("then");
})
.then((value) => print("then 2"));
输出:I/flutter ( 3106): delayed
I/flutter ( 3106): then
I/flutter ( 3106): then 2
I/flutter ( 3106): micro
我们可以看到then是直接运行的。上面的例子 Future.value().then 是因为Future先完成了再调用then,
而Future.delayed是在运行中使用的then,所以这两种逻辑的不同会使then的优先级产生变化
总结
祝大家乘风破浪,
|