Flutter事件循环(Event loop)

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

总结

祝大家乘风破浪,

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值