Flutter 异步全解

一、异步入门 1.1 async和await 这两个关键词的本质是语法糖。例如: void _increment() async { await Future.delayed(Duration(seconds: 1)); setState((){ _counter++; }); } 等价于: void _increment() { Future.delayed(Duration(seconds: 1),(){ setState((){ _counter++; }); }); } 或者: void _increment() { Future.delayed(Duration(seconds: 1)).then( (value) => setState((){ _counter++; }) ); } ​ 这里需要纠正一个误区:就像JS那样,dart的异步操作并非多线程。在dart中,每一个线程都被isolate包裹,它们之间不能共享内存,也就避免了死锁问题,降低了程序复杂度,提升GC的性能。线程之间使用消息队列来通信。 ​ 一个线程怎么处理等待事件呢?这里就要用到Event Loop机制。内置一个Event Queue和MicroTask Queue,只要MicroTask Queue中还有事件没有处理完,则先处理这里面的事件,而此时EventQueue中的事件一个都不会被执行。使用scheduleMicrotask()来向Microtask Queue添加事件。 void main(){ Future(() => print('A')); print('B'); } //打印结果:BA ​ 这里我们还是要提醒一下,只有在出现需要等待的事件时,EventLoop机制才能发挥作用。如果卡顿是因为计算量过大造成的,那么只有多开几个Isolate(线程)来解决了。 1.2 运行时机 直接运行:Future.sync()、Future.value()、_.then() Microtask:scheduleMicrotask()、Future.microtask()、_completed.then() Event:Future()、Future.delayed() 1.3 运行时机举例 直接运行 void main(){ print("1"); Future.value(func()); print("3"); } String func(){ print("2"); return ""; }//输出结果:123 void main(){ print("1"); Future....

November 9, 2021 · 3 min · alvazu