Flutter(十)--Widget的异步-Future、微任务、Isolate(多线程)

本次使用纯代码+注释的方式,将各个知识都展示出来

下方代码可以直接执行,通过查看log来更加深入的了解,在最后有一些理论和自己的一些理解。

/*
*   1,需要注意返回值,=>是return的简写,所以1、2、3的then是compute的后续,所以是在多线程中执行,无序的。
*   2,Future和自己的then是一体的,必定会同步执行,而scheduleMicrotask则是后续添加的所以最后执行
*
* */
void combinText() {
  Future(() => compute(comFunc, '1')).then((val) => print(val)); //1
  Future(() => compute(comFunc, '2')).then((val) => print(val));
  Future(() => compute(comFunc, '3')).then((val) => print(val));

  Future(() {
    compute(comFunc, '4');
    return '4处理';
  }).then((val) => print(val));
  Future(() {
    compute(comFunc, '5');
    return '5处理';
  }).then((val) => print(val));
  Future(() {
    compute(comFunc, '6');
    return '6处理';
  }).then((val) => print(val));

  Future(() {
    compute(comFunc, '7');
    scheduleMicrotask(() {
      print('8处理'); //2
    });
    return '7处理';
  }).then((val) => print(val));
}

/*
* computeTest是Isolate的高层封装
* */
void computeTest() {
  //创建Port
  ReceivePort port = ReceivePort();
  compute(comFunc, '初始值').then((val) => print(val));
}

String comFunc(str) {
  return '${str}处理';
}

/*
* Isolate 多线程
* Isolate 看起来更加像进程.因为有独立的内存空间!
* ReceivePort如果使用到变量,变量是进行深拷贝的值拷贝.内部修改值并不会影响外部变量本身,不用担心多线程的资源抢夺问题!不需要锁!
* */
Future<void> IsolateTest() async {
  //创建Port
  ReceivePort port = ReceivePort();
//创建isolate
  Isolate iso = await Isolate.spawn(isoFunc, port.sendPort);

  port.listen((val) {
    print('内部a=$a');
    a = val;
    port.close();
    iso.kill();
  });

  sleep(Duration(seconds: 1));
  print('外部a=$a');
}

int a = 1;

void isoFunc(SendPort port) {
  sleep(Duration(seconds: 1));
  a = 200;
  print(port);
  port.send(100);
}

//开始 , 5, 3,6,8,7,1,4,10,2,9
void testFuture4() {
  Future x1 = Future(() => null);
  x1.then((value) {
    print('6');
    scheduleMicrotask(() => print('7'));
  }).then((value) => print('8'));
  Future x = Future(() => print('1'));
  x.then((value) {
    print('4');
    Future(() => print('9'));
  }).then((value) => print('10'));

  Future(() => print('2'));
  scheduleMicrotask(() => print('3'));

  print('5');
}

/*
*  scheduleMicrotask微任务
*  在同一方法体中微任务优先级高于Future,
* */
void MicrotTest() {
  print('进入');
  Future(() {
    print('A');
    scheduleMicrotask(() {
      print('A ---- scheduleMicroTask');
    });
    return Future(() => print('A--Future'));
  }).then((value) => print('A结束'));
  scheduleMicrotask(() {
    print('scheduleMicroTask');
  });
}

/*
*  Future异步组
* 在组中是按照同步执行
* */
void FutureGroup() {
  print('进入');
  Future.wait([
    Future.sync(() {
      sleep(Duration(seconds: 2));
      print('结束1');
      return '任务一';
    }),
    Future.sync(() {
      sleep(Duration(seconds: 1));
      print('结束2');
      return '任务二';
    }),
  ]).then((value) {
    print(value);
  });
  print('结束');
}

/*
*  Future也可以同步执行
* */
void FutureSync() {
  print('进入');
  Future.sync(() {
    sleep(Duration(seconds: 1));
    print('异步操作');
  });
  print('结束');
}

//future的优先级比then低
/*
*  Future执行完之后, 会将涉及到的所有then进行一次性添加
* */
void FutureThenOrder() {
  Future(() {
    sleep(Duration(seconds: 1));
    return '第一个异步处理';
  }).then((e) {
    print(e);
    return Future(() {
      sleep(Duration(seconds: 1));
      return '第二个异步处理';
    });
  }).then((e) {
    print(e);
    return '第一个异步处理2';
  });
}

/*
* 1,FutureOr<T>表示可以返回一个Future对象或者是<T>实例
* 2,catchError在then前时,无法阻止then的执行,因为当前then实际上是在捕获catcherror这个Future
* 3, catchError的闭包返回值是依附上一层的<T>,如果上一层没有返回值,catcherror中的返回值需要单声明变量后使用
* 4, 超时
* */
Future<void> throwError() async {
  print('进入');

  Future future = Future(() {
    //1
    print('异步操作');
    sleep(Duration(seconds: 1));
//    return '异步完成';
    throw Exception('出错了');
  })
      .then((val) {
        print('第一次then:${val}');
        return '第一次then结束';
      })
      .catchError((e) {
        print('errpr:${e}');
        return '错误处理'; //3
      })
      .then((e) => print(e)) //2
      .timeout(Duration(seconds: 1)); //4
  print('结束');
}

/*
*   1,使用await以后下方所有代码都将进行同步执行
*   2,async/await必须成对出现,使用async进行方法的修饰后返回值必须也是Future<T>
* */
Future<void> getParams1() async {
  print('进入');

  await Future(() {
    sleep(Duration(seconds: 1));
    print('异步操作');
  });

  print('结束');
}

最后是自己对异步执行的一些理解,比较零散,在此做个记录。

就算是将上述代码一一执行,一定也会有一些不理解的地方,这就需要一些理论的支持。

这是从官网拿下来的图,图中清楚的展示了各种任务的执行顺序。


2-12.png
图中的解读:
  1. 一切执行都是从main函数开始。(有点废话了。。。)
  2. 微任务的执行优先级是最高的,接下来才是事件队列(future+then)
  3. 微任务、事件队列在执行完成后都会检查是否还有其他任务,而且会从原路径去检查是否有微任务->是否有事件队列的顺序,直到任务结束。
    也就是说在任务的执行过程中,又有新的任务添加,就会通过这种方式来执行。
  4. 完成之后退出。
  5. Future和then是一对属于事件队列中,必定会同步先后执行,并不是在Future执行完成后才去进行添加的。

传送门:

Flutter-汇总

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,951评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,606评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,601评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,478评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,565评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,587评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,590评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,337评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,785评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,096评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,273评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,935评论 5 339
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,578评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,199评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,440评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,163评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,133评论 2 352