Flutter 入门 - 异步

186 阅读1分钟

Dart 属于单线程

那如何处理耗时操作呢?

  • java、oc 普遍做法是开启一个新的线程处理耗时操作
  • js、dart 基于单线程加事件循环来完成耗时操作的处理

阻塞式调用 & 非阻塞式调用

  • 阻塞式调用:  调用结果返回之前,当前线程会被挂起,调用线程只有在得到调用结果之后才会继续执行。
  • 非阻塞式调用:  调用执行之后,当前线程不会停止执行,只需要过一段时间来检查一下有没有结果返回即可。

事件循环

  • 将需要处理的一些列事件(包括点击事件、IO事件、网络)放在一个事件队列中 (Event Queue)中
  • 不断的从事件队列中取出事件,并执行

Future

Future可以做到不阻塞我们的线程,让线程继续执行

Future 创建及捕获异常

 Future future = getNewData();
 future.then((value) {
    print(value);
  }).catchError((err) {// 捕获异常
    print(err);
  });

链式调用

getNewData().then((value) {
    print(value);
    return "第二次结果";
  }).then((value) {
    print(value);
    return "第三次结果";
  }).then((value) {
    print(value);
  });

延迟

  Future.delayed(Duration(seconds: 3), () {
    print("延迟三秒");
  });

await && async

可以让我们用同步的代码格式,去实现异步的调用过程

  • 通常一个async的函数会返回一个Future
  • await关键字必须存在于async函数中
network().then((value) {
    print(value);
  });

Future<String> network() async {
  // await关键字必须存在于async函数中
  var res = await Future.delayed(Duration(seconds: 3), () {
    return "net work";
  });
  return "请求的数据:" + res;
}