23 | 单线程模型怎么保证UI运行流畅?
该思维导图由 AI 生成,仅供参考
Event Loop 机制
- 深入了解
- 翻译
- 解释
- 总结
Dart语言的异步与并发机制是Flutter开发中的关键技术,本文深入介绍了Dart单线程模型下的代码运行本质以及如何在工作中使用Future与Isolate优化项目。通过讲解Dart语言的Event Loop处理机制、异步处理和并发编程的原理和使用方法,读者可以深入了解Flutter开发技术。文章强调了异步与多线程的区别,以及在UI编程过程中的应用。此外,文章还提出了两道思考题,引发读者思考与讨论。整体而言,本文适合想要深入了解Flutter开发技术的读者阅读。
《Flutter 核心技术与实战》,新⼈⾸单¥59
全部留言(57)
- 最新
- 精选
- jerry您好老师,单线程模型是指的事件队列模型,和绘制界面的线程是一个吗
作者回复: 我们所说的单线程指的是主Isolate。而GPU绘制指令有单独的线程执行,跟主Isolate无关。事实上Flutter提供了4种task runner,有独立的线程去运行专属的任务: 1.Platform Task Runner:处理来自平台(Android/iOS)的消息 2.UI Task Runner:执行渲染逻辑、处理native plugin的消息、timer、microtask、异步I/O操作处理等 3.GPU Task Runner:执行GPU指令 4.IO Task Runner:执行I/O任务 除此之外,操作系统本身也提供了大量异步并发机制,可以利用多线程去执行任务(比如socket),我们在主Isolate中无需关心(如果真想主动创建并发任务也可以)
2019-10-2922 - Geek_keyi对Dart单线程模型理解还是迷惑,请教一下:假如有一个任务(读写文件或者网络)耗时10秒,并且加入到了事件任务队列中,执行单这个任务的时候不就把线程卡主吗?
作者回复: 文件I/O和网络调用并不是在Dart层做的,而是由操作系统提供的异步线程,他俩把活儿干完之后把结果刚到队列中,Dart代码只是执行一个简单的读动作。
2019-09-25615 - 吴小安现在手机都是多核,使用future执行异步任务都是放在当前线程,而要在其他线程执行就要这么麻烦,这样大部分人写的异步任务都发挥不了多核的性能,是不是有点浪费?
作者回复: 无需担心,我们说的单线程其实是针对主Isolate的。事实上Flutter提供了4种task runner,他们有独立的线程去运行专属的任务: 1.Platform Task Runner:处理来自平台(Android/iOS)的消息 2.UI Task Runner:执行渲染逻辑、处理native plugin的消息、timer、microtask、异步I/O操作处理等 3.GPU Task Runner:执行GPU指令 4.IO Task Runner:执行I/O任务 这些特定任务的执行都是固定的套路,另外操作系统本身也提供了大量异步并发机制,可以利用多线程去执行任务(比如socket),我们在主Isolate中无需关心(如果真想主动创建并发任务也可以),因此说基于主Isolate的Flutter是单线程模型的。
2019-08-2134 - Geek_20f143Future(() => print('a1')) .then((_) { Future(() => print('a2')); }).then((_) => print('a3')); Future(() => print('a1')) .then((_) => Future(() => print('a2'))) .then((_) => print('a3')); 老师,为什么第一部分打印顺序是a1 a3 a2... 第二部分打印顺序是a1 a2 a3 a2区别那部分不是只是语法糖吗?
作者回复: 你把第一个语句的then加个return再试试 Future(() => print('a1')) .then((_) { return Future(() => print('a2')); }).then((_) => print('a3'));
2019-12-103 - 菜头1、因为两个 SendPort 的作用不一样 第一个 SendPort 是为了让并发 Isolate 回传一个 SendPort 第二个 SendPort 是为了让并发 Isolate 回传结果 可以改造成一个 监听第一个 SendPort 的回调,根据结果类型复用这个 SendPort 并且在计算结果完成之后关掉 SendPort 即可
作者回复: 可以的,赞👍
2019-11-1933 - GGL// 第一段 Future(() => print('f6')) .then((_) => Future(() => print('f7'))) .then((_) => print('f8')); 执行结果为:f6 f7 f8 // 第二段 Future(() => print('f6')) .then((_) { Future(() => print('f7')); }) .then((_) => print('f8')); 执行结果为:f6 f8 f7 老师,上面这两段代码为什么执行结果不一样呢?
作者回复: 单行箭头函数是Future,和函数体里有Future不是一回事
2019-11-0372 - 楼外楼Dart 中的 await 并不是阻塞等待,而是异步等待,这句话是不是有问题,await 就是阻塞后面代码执行,等待异步代码返回。难道我理解有误?
作者回复: await阻塞的是当前上下文的后续代码执行,并不能阻塞其调用栈上层的后续代码执行
2019-08-302 - lkFuture(() => print('f1')) .then((_) async => scheduleMicrotask(() => print('f2'))) .then((_) => print('f3')); Future(() => print('f4'));
作者回复: 赞👍另外建议把await加上
2019-08-292 - 满大大await 的上下文函数并不包含调用栈,因此 func 后续代码继续执行,打印“func after”。这里怎么理解?
作者回复: 就是await只等待当前的语句,并不是以把整个调用栈都锁死的方式进行等待。
2019-12-061 - Geek_869250老师可以和JS的event loop做个比较吗
作者回复: 基本上一样,因为Dart的单线程模型就是借鉴的js
2019-10-2821