Flutter(十)--Widget的異步-Future、微任務(wù)县习、Isolate(多線程)

本次使用純代碼+注釋的方式涮母,將各個(gè)知識(shí)都展示出來

下方代碼可以直接執(zhí)行,通過查看log來更加深入的了解躁愿,在最后有一些理論和自己的一些理解叛本。

/*
*   1,需要注意返回值,=>是return的簡(jiǎn)寫攘已,所以1炮赦、2、3的then是compute的后續(xù)样勃,所以是在多線程中執(zhí)行,無序的性芬。
*   2,Future和自己的then是一體的峡眶,必定會(huì)同步執(zhí)行,而scheduleMicrotask則是后續(xù)添加的所以最后執(zhí)行
*
* */
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() {
  //創(chuàng)建Port
  ReceivePort port = ReceivePort();
  compute(comFunc, '初始值').then((val) => print(val));
}

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

/*
* Isolate 多線程
* Isolate 看起來更加像進(jìn)程.因?yàn)橛歇?dú)立的內(nèi)存空間!
* ReceivePort如果使用到變量植锉,變量是進(jìn)行深拷貝的值拷貝.內(nèi)部修改值并不會(huì)影響外部變量本身,不用擔(dān)心多線程的資源搶奪問題!不需要鎖!
* */
Future<void> IsolateTest() async {
  //創(chuàng)建Port
  ReceivePort port = ReceivePort();
//創(chuàng)建isolate
  Isolate iso = await Isolate.spawn(isoFunc, port.sendPort);

  port.listen((val) {
    print('內(nèi)部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微任務(wù)
*  在同一方法體中微任務(wù)優(yōu)先級(jí)高于Future辫樱,
* */
void MicrotTest() {
  print('進(jìn)入');
  Future(() {
    print('A');
    scheduleMicrotask(() {
      print('A ---- scheduleMicroTask');
    });
    return Future(() => print('A--Future'));
  }).then((value) => print('A結(jié)束'));
  scheduleMicrotask(() {
    print('scheduleMicroTask');
  });
}

/*
*  Future異步組
* 在組中是按照同步執(zhí)行
* */
void FutureGroup() {
  print('進(jìn)入');
  Future.wait([
    Future.sync(() {
      sleep(Duration(seconds: 2));
      print('結(jié)束1');
      return '任務(wù)一';
    }),
    Future.sync(() {
      sleep(Duration(seconds: 1));
      print('結(jié)束2');
      return '任務(wù)二';
    }),
  ]).then((value) {
    print(value);
  });
  print('結(jié)束');
}

/*
*  Future也可以同步執(zhí)行
* */
void FutureSync() {
  print('進(jìn)入');
  Future.sync(() {
    sleep(Duration(seconds: 1));
    print('異步操作');
  });
  print('結(jié)束');
}

//future的優(yōu)先級(jí)比then低
/*
*  Future執(zhí)行完之后, 會(huì)將涉及到的所有then進(jìn)行一次性添加
* */
void FutureThenOrder() {
  Future(() {
    sleep(Duration(seconds: 1));
    return '第一個(gè)異步處理';
  }).then((e) {
    print(e);
    return Future(() {
      sleep(Duration(seconds: 1));
      return '第二個(gè)異步處理';
    });
  }).then((e) {
    print(e);
    return '第一個(gè)異步處理2';
  });
}

/*
* 1俊庇,F(xiàn)utureOr<T>表示可以返回一個(gè)Future對(duì)象或者是<T>實(shí)例
* 2狮暑,catchError在then前時(shí),無法阻止then的執(zhí)行,因?yàn)楫?dāng)前then實(shí)際上是在捕獲catcherror這個(gè)Future
* 3, catchError的閉包返回值是依附上一層的<T>,如果上一層沒有返回值辉饱,catcherror中的返回值需要單聲明變量后使用
* 4, 超時(shí)
* */
Future<void> throwError() async {
  print('進(jìn)入');

  Future future = Future(() {
    //1
    print('異步操作');
    sleep(Duration(seconds: 1));
//    return '異步完成';
    throw Exception('出錯(cuò)了');
  })
      .then((val) {
        print('第一次then:${val}');
        return '第一次then結(jié)束';
      })
      .catchError((e) {
        print('errpr:${e}');
        return '錯(cuò)誤處理'; //3
      })
      .then((e) => print(e)) //2
      .timeout(Duration(seconds: 1)); //4
  print('結(jié)束');
}

/*
*   1,使用await以后下方所有代碼都將進(jìn)行同步執(zhí)行
*   2,async/await必須成對(duì)出現(xiàn)搬男,使用async進(jìn)行方法的修飾后返回值必須也是Future<T>
* */
Future<void> getParams1() async {
  print('進(jìn)入');

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

  print('結(jié)束');
}

最后是自己對(duì)異步執(zhí)行的一些理解,比較零散彭沼,在此做個(gè)記錄缔逛。

就算是將上述代碼一一執(zhí)行,一定也會(huì)有一些不理解的地方,這就需要一些理論的支持褐奴。

這是從官網(wǎng)拿下來的圖按脚,圖中清楚的展示了各種任務(wù)的執(zhí)行順序。


2-12.png
圖中的解讀:
  1. 一切執(zhí)行都是從main函數(shù)開始敦冬。(有點(diǎn)廢話了辅搬。。脖旱。)
  2. 微任務(wù)的執(zhí)行優(yōu)先級(jí)是最高的堪遂,接下來才是事件隊(duì)列(future+then)
  3. 微任務(wù)、事件隊(duì)列在執(zhí)行完成后都會(huì)檢查是否還有其他任務(wù)夯缺,而且會(huì)從原路徑去檢查是否有微任務(wù)->是否有事件隊(duì)列的順序蚤氏,直到任務(wù)結(jié)束。
    也就是說在任務(wù)的執(zhí)行過程中踊兜,又有新的任務(wù)添加竿滨,就會(huì)通過這種方式來執(zhí)行。
  4. 完成之后退出捏境。
  5. Future和then是一對(duì)屬于事件隊(duì)列中于游,必定會(huì)同步先后執(zhí)行,并不是在Future執(zhí)行完成后才去進(jìn)行添加的垫言。

傳送門:

Flutter-匯總

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末贰剥,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子筷频,更是在濱河造成了極大的恐慌蚌成,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件凛捏,死亡現(xiàn)場(chǎng)離奇詭異担忧,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)坯癣,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門瓶盛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人示罗,你說我怎么就攤上這事惩猫。” “怎么了蚜点?”我有些...
    開封第一講書人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵轧房,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我禽额,道長(zhǎng)锯厢,這世上最難降的妖魔是什么皮官? 我笑而不...
    開封第一講書人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮实辑,結(jié)果婚禮上捺氢,老公的妹妹穿的比我還像新娘。我一直安慰自己剪撬,他們只是感情好摄乒,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著残黑,像睡著了一般馍佑。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上梨水,一...
    開封第一講書人閱讀 49,166評(píng)論 1 284
  • 那天拭荤,我揣著相機(jī)與錄音,去河邊找鬼疫诽。 笑死舅世,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的奇徒。 我是一名探鬼主播雏亚,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼摩钙!你這毒婦竟也來了罢低?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬榮一對(duì)情侶失蹤胖笛,失蹤者是張志新(化名)和其女友劉穎网持,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體长踊,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡翎碑,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了之斯。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡遣铝,死狀恐怖佑刷,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情酿炸,我是刑警寧澤瘫絮,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站填硕,受9級(jí)特大地震影響麦萤,放射性物質(zhì)發(fā)生泄漏鹿鳖。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一壮莹、第九天 我趴在偏房一處隱蔽的房頂上張望翅帜。 院中可真熱鬧,春花似錦命满、人聲如沸涝滴。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽歼疮。三九已至,卻和暖如春诈唬,著一層夾襖步出監(jiān)牢的瞬間韩脏,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來泰國(guó)打工铸磅, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留赡矢,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓愚屁,卻偏偏與公主長(zhǎng)得像济竹,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子霎槐,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344