IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Flutter事件循环(Event loop) -> 正文阅读

[移动开发]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的优先级产生变化 

总结

祝大家乘风破浪,

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-07-20 19:00:48  更:2022-07-20 19:03:29 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 3:58:27-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码