![8de2aa2d0179993e2b20394a218201b0.png](https://i-blog.csdnimg.cn/blog_migrate/648ba3e1520045163e89bd524febea65.jpeg)
关注【搜狐技术产品】,第一时间获取技术干货
导读
从18年底Flutter1.0正式版发布以来,在国内出现了爆发式增长,包括闲鱼、抖音、今日头条在内的大多数公司,相继接入了Flutter,通过Flutter进行跨平台开发。
在使用Flutter的过程中,我们也需要对其一些特性进行研究和掌握,如果只是调用API的话并不能领悟到Flutter的精髓。
本篇文章详细讲解了Flutter的多线程,由于笔者是做iOS开发的,并且将Flutter的多线程和iOS的GCD进行了对比,以帮助大家理解Flutter多线程。
事件队列
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
高。
![1912dea289902d6c7b68c098abf353fb.png](https://i-blog.csdnimg.cn/blog_migrate/005e9f0632d24e70f11096c58bc6e9a3.png)
这两个队列也是有优先级的,当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
。
1Future<Response> dataReqeust() async {
2 String requestURL = 'https://jsonplaceholder.typicode.com/posts';
3 Client client = Client();
4 Future<Response> response = client.get(reque