flutter 队列

2022-12-19 15:56:38 浏览数 (1)

代码语言:javascript复制
void main() {
  //dart 是一门单线程语言,但是可通过async await 将任务添加到异步队列来管理任务异步去做
  //await 所在的函数必须是异步函数,async修饰的函数
  getDatas1();
  print('执行其他操作');
}

/*结论分析
添加到主队列的任务:
I/flutter ( 1891): 任务开始
I/flutter ( 1891): 任务4
I/flutter ( 1891): 执行其他操作
添加到异步队列的任务
I/flutter ( 1891): 任务1
I/flutter ( 1891): 任务2
I/flutter ( 1891): 任务3
无论添加到那个队列,任务在所在队列都按照添加顺序同步执行
 */
getDatas() async {
  print('任务开始');
  Future((){
    sleep(const Duration(seconds: 5));
    print('任务1');
  });
  Future((){
    print('任务2');
  });
  Future((){
    print('任务3');
  });
  print('任务4');
}

/*结论分析
I/flutter ( 1891): 任务开始
I/flutter ( 1891): 执行其他操作
I/flutter ( 1891): 任务1
I/flutter ( 1891): 任务4
I/flutter ( 1891): 任务2
I/flutter ( 1891): 任务3
 */
getDatas1() async {
  print('任务开始');
  await Future((){
    sleep(const Duration(seconds: 5));
    print('任务1');
  });
  //await 的效果等同于下面的任务都用then{}包起来了。
  Future((){
    print('任务2');
  });
  Future((){
    print('任务3');
  });
  print('任务4');//先于任务2、3执行,Future是添加完当前所有任务到异步队列后在逐个执行,任务4马上就执行了
}

总结:dart 是一门单线程语言,但是可通过async await 将任务添加到异步队列来管理,来达到任务异步去执行 await 所在的函数必须是异步函数,async修饰的函数

catchaError的问题:已经抛出error了,后面代码还会继续执行,这不符合常规。官方解析是catchError

必须放到future的最后,好吧有个性。

代码语言:javascript复制
futureAction() async {
  Future future = Future(() {
    for(int i = 0; i < 1000; i  ) {

    }
    throw Exception('任务异常');
    //return '任务完成';
  });
  future.catchError((e){print('$e');})
      .then((value) => print('$value'))
      .whenComplete(() => print('任务结束'));
      // .catchError((error){print('$error');});

}

I/flutter ( 1891): Exception: 任务异常
I/flutter ( 1891): null
I/flutter ( 1891): 任务结束

多任务处理,利用future的wait包装一组任务

代码语言:javascript复制
mutipleFutureAction() async {
  Future future = Future.wait([
    Future(() {
      print('任务1');
    }),
    Future(() {
      print('任务2');
    }),
  ]);
  future.then((value) {
    print('任务1和任务2,已执行完毕');
  });
}

执行顺序:同步队列->异步队列,都在主线程上执行。

代码语言:javascript复制
void testFuture(){
  debugPrint('外部代码1');
  Future(() => debugPrint('task A')).then((value) => debugPrint('task A 结束'));
  Future(() => debugPrint('task B')).then((value) => debugPrint('task B 结束'));
  sleep(const Duration(seconds: 3));
  debugPrint('外部代码2');
}

I/flutter ( 1559): 外部代码1
I/flutter ( 1559): 外部代码2
I/flutter ( 1559): task A
I/flutter ( 1559): task A 结束
I/flutter ( 1559): task B
I/flutter ( 1559): task B 结束

0 人点赞