前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >flutter 队列

flutter 队列

原创
作者头像
黑兔
修改2022-12-19 15:56:38
5610
修改2022-12-19 15:56:38
举报
文章被收录于专栏:羊了个羊
代码语言: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 结束

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
腾讯云 BI
腾讯云 BI(Business Intelligence,BI)提供从数据源接入、数据建模到数据可视化分析全流程的BI能力,帮助经营者快速获取决策数据依据。系统采用敏捷自助式设计,使用者仅需通过简单拖拽即可完成原本复杂的报表开发过程,并支持报表的分享、推送等企业协作场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档