【Flutter】一文搞懂异步编程

1 事件循环机制(Event Loop)

Flutter中异步操作不是多线程,与Java不同。

程序无响应原因:
①计算量过大;
②等待操作。

多线程(Multithreading):耗时操作时,新建线程进行操作,渲染 UI 的主线程就不会被挂起引起卡顿。
【Flutter】一文搞懂异步编程_第1张图片
Isolate(隔离):Dart 中的线程,但又与线程不同,是微线程或协程。与线程的区别是不能共享内存,同时也不存在锁竞争的问题。 每个Isolate都是独立的执行线,有自己的事件循环,只能通过发送消息进行通信,所以资源开销低于线程。
【Flutter】一文搞懂异步编程_第2张图片
在实际项目中不需要是Isolate来创建线程,使用单个线程本身的事件循环。

事件循环机制:保证 main() 中代码不断循环,不会运行一下就结束。主要操作就是检查 Event Queue 中的事件并执行,所以异步操作就是向 Event Queue 中添加事件。
只要Microtask中还存在事件就要执行 Microtask ,执行完后才能执行 Event Queue中的事件
【Flutter】一文搞懂异步编程_第3张图片
向 Event Queue 中添加事件:

void main() {
   
	//在事件队列中添加打印A事件
	Future(
		() => print("A"));
	//执行完打印B后检查事件队列
	print("B");
}

输出结果:先打印B后打印A

向 Microtask Queue 中添加事件:

void main() {
   
	scheduleMicrotask(
		() => print("A"));
	print("B");
}

在实际项目中不会特别使用 Microtask Queue

总结:
①直接运行

Future.sync()
Future.value()

_.then()

②Microtask

scheduleMicrotask()
Future.microtask()

_conpleted.then()

③Event

Future()
Future.delayed()

2 Future详解

示例:

http.get(url).then((value) => null).catchError(onError);

2.1 创建Future

立即执行Future.sync();
最后执行Future();

void main() {
   

  Future.delayed(Duration(seconds: 1), () => print("Future 3"));
  Future(() => print("Future 1"));
  Future.delayed(Duration.zero, () => print("Future 2"));//Duration.zero是否存在按照语句顺序执行
  
  scheduleMicrotask(() => print("microtask 1"));
  Future.microtask(() => print("microtask 2"));
  Future.value(123).then((value) => print("microtask 3"));

  print("main 1");
  Future.sync(() => print("sync"));
  Future.value(getName());//直接返回结果
  print("main 2");


  runApp(MyApp());
}

String getName() {
   
  print("Future value");
  return "Future value";
}

查看打印结果:

I/flutter (19131): main 1
I/flutter (19131): sync
I/flutter (19131): Future value
I/flutter (19131): main 2
I/flutter (19131): microtask 1
I/flutter (19131): microtask 2
I/flutter (19131): microtask 3
I/flutter (19131): Future 1
I/flutter (19131): Future 2
I/flutter (19131): Future 3 //等待1s后打印

then()的使用:

void main() {
   

  Future.delayed(Duration(seconds: 1), () => print("delayed"))
      .then((value) {
   
        scheduleMicrotask(() => print("micro"));
        print("then 1");
      })
      .then((

你可能感兴趣的:(Flutter,flutter)