flutter 学习之单线程模型如何确保UI运行流畅

001 Event Loop机制

异步意味着代码执行是有序的,不会被其他代码中断,单线程和异步并不冲突。单线程模型可以等待过程中分做别的事情,等真正需要相应结果的时候再去做对应的处理,因为等待的过程并不是阻塞,只是给咱们的一个假象,本质是只有一个线程在处理事情。这个等待行为是通过Event Loop驱动,事件队列Event Queue会把其他平行任务完成的,需要主线程响应的事件放入其中。通过不断轮询事件队列,取出事件,在主线程同步执行回调函数。可以理解成Run loop

002 异步处理

未任务队列:一个段时间就会完成异步任务。未任务在事件循环的优先级是最高的。

Dart为Event Queue的任务建立提供一层封装,叫做Future。一个在未来时间才会完成的任务。

把一个函数体放入Future,就完成同步任务到异步任务的包装。


//f1比f2先执行
Future(() => print('f1'));
Future(() => print('f2'));

//f3执行后会立刻同步执行then 3
Future(() => print('f3')).then((_) => print('then 3'));

//then 4会加入微任务队列,尽快执行
Future(() => null).then((_) => print('then 4'));

then会Future函数体执行完毕后立即执行,无论是共用同一个事件循环还是进入下一个微任务。

同步等待使用await,在调用处的函数体使用async关键字。Dart中await并不是阻塞等待,而是异步等待。

003 并发编程 

关键字Isolate (隔离)

在Isolate中,资源隔离做的非常好,每个isolate都有自己的EventLoop与Queue,isolate 之间不共享任何资源,只能依靠消息机制通信,

因此也就没有资源抢占问题。对于执行结果,isolate通过管道实现消息通信机制。在启动并发isolate时将

isolate的发送管道作为参数传给它,这样并发isolate就可以在任务执行完毕后利用这个发送管道给咱们发消息了。

可以实现双端通信,让并发isolate也回传一个发送管道。也可以通过关键词compute函数,其内部对isolate创建和

双向通信进行了封装,屏蔽了很多底层细节。

 

示例代码

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值