作者回复: 单行箭头函数是Future,和函数体里有Future不是一回事
作者回复: 赞👍另外建议把await加上
作者回复: 我们所说的单线程指的是主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中无需关心(如果真想主动创建并发任务也可以)
作者回复: 文件I/O和网络调用并不是在Dart层做的,而是由操作系统提供的异步线程,他俩把活儿干完之后把结果刚到队列中,Dart代码只是执行一个简单的读动作。
作者回复: import 'package:flutter/foundation.dart';
作者回复: 你把第一个语句的then加个return再试试
Future(() => print('a1'))
.then((_) {
return Future(() => print('a2'));
}).then((_) => print('a3'));
作者回复: 就是await只等待当前的语句,并不是以把整个调用栈都锁死的方式进行等待。
作者回复: 可以的,赞👍
作者回复: 1.你这个代码编译不通过吧
2.单行箭头函数的then是Future,和函数体内有Future不是一回事
作者回复: f7这个 then 是一个 Future 异步任务,因此这个 then,以及后续的 then 都被放入到事件队列中了
作者回复: 基本上一样,因为Dart的单线程模型就是借鉴的js
作者回复: 不对哦,注意看其实我在并发Isolate中发了两次SendPort
作者回复: 1.文件I/O和网络调用这类底层服务调用,只是Embedder层做了一次封装,底层有专门的线程处理这些任务;
2.两者设计理念不同而已,原生Android更底层。你也可以试着增加一层,用线程池模拟出类似Dart的Isolate机制,实现I/O、网络调用的异步化。
作者回复: Future f = Future(() => print('f1'));
f.then((_) => Future(() => print('f2')));
f.then((_) => print('f3'));
Future(() => print('f4'));
这么看明白了么
作者回复: await阻塞的是当前上下文的后续代码执行,并不能阻塞其调用栈上层的后续代码执行
作者回复: 不可以,因为资源完全隔离