当前位置 主页 > 网站技术 > 代码类 >

    Flutter 假异步的实现示例

    栏目:代码类 时间:2019-11-01 15:05

    就像 android 有 handle 一样,消息队列这东西好像还真是系统必备,Flutter 也有自己的消息队列,只不过队列直接封装在了 Dart 的线程类型 Isolate 里面了,不过 Flutter 还是提供了 Futrue 这个 API 来专门来操作各种消息,以及实现基于消息队列的假异步

    Flutter 的“异步”机制

    这里的异步是加了引号的,可见此异步非真异步,而是假异步。Flutter 的 异步 不是开新线程,而是往所属线程的 消息队列 中添加任务,当然大家也可以按上文那样自己展开真异步操作

    Flutter 对代码分2类: 同步代码和异步代码

    同步代码:传统一行行写下来,一行行执行的代码 异步代码:通过 Future API 把任务添加到 Isolate 所属消息队列执行的伪异步 执行顺序:先运行同步代码,再运行异步代码

    为啥,很明显啊,异步代码是往消息队列里添加任务,那肯定得等现在的代码运行完了,线程有空闲了才能开始执行消息队列里的任务呀~

    举个例子:

    void test() {
      print("AA");
      Future(() => print("Futrue"));
      print("BB");
    }
    ~~~~~~~~~~~log~~~~~~~~~~~~~
    I/flutter (10064): AA
    I/flutter (10064): BB
    I/flutter (10064): Futrue

    print("Futrue")) 任务等到最后才执行的...

    Flutter 提供了往 消息队列 添加数据的 API: Future

    往 MicroTask 队列添加任务

    scheduleMicrotask((){
     // ...code goes here...
    }); 
    
    new Future.microtask((){
      // ...code goes here...
    });

    往 Event 队列添加任务

    new Future(() {
     // ...code goes here...
    });

    Future 的基本使用

    Future 对象是 Flutter 专门提供的,基于消息队列实现异步的类,Future 对象会把自身当做一个任务添加到消息队列中去排队执行

    Future 对象接受的是一个函数,就是要执行的任务,用 () => ... 简写也是可以的

    void task() {
      print("AA");
    }
    
    var futrue = Future(task);

    创建 Future 任务方式:

    Future() Future.microtask() Future.sync() - 同步任务 Future.value() Future.delayed() - 延迟xx时间添加任务 Future.error() - 错误处理

    我们来看几个代表性的:

    Future.sync() - 阻塞任务,会阻塞当前代码,sync 的任务执行完了,代码才能走到下一行

    void test() {
      print("AA");
      Future.sync(() => print("Futrue"));
      print("BB");
    }
    ~~~~~~~~~~~~log~~~~~~~~~~~~~~
    I/flutter (10573): AA
    I/flutter (10573): Futrue
    I/flutter (10573): BB

    Future.delayed() - 延迟任务,指定xx时间后把任务添加到消息队列,要是消息队列前面有人执行的时间太长了,那么执行时间点就不能把握了,这点大家要知道

    void test() {
      print("AA");
      Future.delayed(Duration(milliseconds: 500),() => print("Futrue"));
      print("BB");
    }
    ~~~~~~~~~~~~log~~~~~~~~~~~~~~
    I/flutter (10573): AA
    I/flutter (10573): BB
    I/flutter (10573): Futrue

    Future 的链式调用

    Future 也支持链式调用的,在 API 使用上也是很灵活的,提供了下面的选择给大家

    .then - 在 Future 执行完后执行,相当于一个 callback,而不是重新创建了一个 Future