Flutter事件循环(Event loop)

Flutter事件循环(Event loop)


文章目录

  • Flutter事件循环(Event loop)
  • 前言
  • 一、什么是Event loop?
  • 二、玩转Event loop
    • 1.直接运行 ——在main函数中直接运行
      • Future.sync()
      • Future.value()
      • _.then()
    • 2.Microtask队列
      • scheduleMicrotask()
      • Future.microtask()
      • _completed.then()
    • 3.Event队列
      • Future
      • Future.delayed()
    • 4.then()补充
      • _.then
      • _completed.then()
  • 总结


前言

在学习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自己的有些事件也不会被执行。
总结一下就是
Flutter事件循环(Event loop)_第1张图片

二、玩转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的优先级产生变化 

总结

祝大家乘风破浪,

你可能感兴趣的:(flutter,android,ios)