该文章属于<简书 — 刘小壮>原创,转载请注明:
<简书 — 刘小壮> https://www.jianshu.com/p/54da18ed1a9e
Flutter
默认是单线程任务处理的,如果不开启新的线程,任务默认在主线程中处理。
事件队列
和iOS应用很像,在Dart
的线程中也存在事件循环和消息队列的概念,但在Dart
中线程叫做isolate
。应用程序启动后,开始执行main
函数并运行main isolate
。
每个isolate
包含一个事件循环以及两个事件队列,event loop
事件循环,以及event queue
和microtask queue
事件队列,event
和microtask
队列有点类似iOS的source0
和source1
。
- event queue:负责处理I/O事件、绘制事件、手势事件、接收其他
isolate
消息等外部事件。 - microtask queue:可以自己向
isolate
内部添加事件,事件的优先级比event queue
高。
这两个队列也是有优先级的,当isolate
开始执行后,会先处理microtask
的事件,当microtask
队列中没有事件后,才会处理event
队列中的事件,并按照这个顺序反复执行。但需要注意的是,当执行microtask
事件时,会阻塞event
队列的事件执行,这样就会导致渲染、手势响应等event
事件响应延时。为了保证渲染和手势响应,应该尽量将耗时操作放在event
队列中。
async、await
在异步调用中有三个关键词,async
、await
、Future
,其中async
和await
需要一起使用。在Dart
中可以通过async
和await
进行异步操作,async
表示开启一个异步操作,也可以返回一个Future
结果。如果没有返回值,则默认返回一个返回值为null
的Future
。
async
、await
本质上就是Dart
对异步操作的一个语法糖,可以减少异步调用的嵌套调用,并且由async
修饰后返回一个Future
,外界可以以链式调用的方式调用。这个语法是JS
的ES7
标准中推出的,Dart
的设计和JS
相同。
下面封装了一个网络请求的异步操作,并且将请求后的Response
类型的Future
返回给外界,外界可以通过await
调用这个请求,并获取返回数据。从代码中可以看到,即便直接返回一个字符串,Dart
也会对其进行包装并成为一个Future
。
Future<Response> dataReqeust() async {
String requestURL = 'https://jsonplaceholder.typicode.com/posts';
Client client = Client();
Future<Response> response = client.get(requestURL);
return response;
}
Future<String> loadData() async {
Response response = await da