Flutter 學(xué)習(xí)之路 - 異步任務(wù)

實(shí)驗(yàn) Flutter 的異步任務(wù) --- 代碼Github地址

Fultter 異步任務(wù)試驗(yàn)

Flutter 在很多地方需要用到異步的任務(wù)剥险,例如,加載網(wǎng)絡(luò)數(shù)據(jù)匹厘,任務(wù)延遲執(zhí)行等祷嘶,所以異步任務(wù)是不可避免的問題搁胆。本次試驗(yàn)主要試驗(yàn)了下面幾種情況:

  • 用 Future, then 實(shí)現(xiàn)任務(wù)延遲執(zhí)行
  • 用 async 和 await 實(shí)現(xiàn)任務(wù)延遲執(zhí)行
  • 測(cè)試調(diào)用 async 方法時(shí),代碼的執(zhí)行順序問題

代碼地址

用 Future, then 實(shí)現(xiàn)任務(wù)延遲執(zhí)行

Future 可以用來執(zhí)行未來要執(zhí)行的方法甥捺,例如下面代碼抢蚀,先輸出 ”Started“, 調(diào)用 Future 以后過了一秒鐘,再輸出 ”Completed Task1“镰禾。

void thenCatch(){
  mytext="Started";
  setMyTextState(mytext);
  // then 用來說明 1 second 后做什么
  Future.delayed(Duration(seconds: 1)).then((_){
    // 當(dāng)運(yùn)行完成
    mytext = mytext + "\n" + "Completed Task1";
    setMyTextState(mytext);
  }).catchError((e){
    // 當(dāng)運(yùn)行失敗
    mytext=mytext+"\n"+'failed: ${e.toString()}';
    setMyTextState(mytext);
  });
}

用 async 和 await 實(shí)現(xiàn)任務(wù)延遲執(zhí)行

await 也是 Flutter 中很好的一種執(zhí)行異步任務(wù)的方法皿曲。

但是要使用await,必須在有async標(biāo)記的函數(shù)中運(yùn)行吴侦,否則這個(gè)await會(huì)報(bào)錯(cuò)屋休。

下面是一個(gè)加了 await 的方法,它的輸出是怎么樣呢?

Future<void> asyncAwait() async{
  mytext="Started";
  setMyTextState(mytext);
  try{
    // 這里沒有 .then, 要加 await, await 是說在 await 完成前別往下執(zhí)行
    await Future.delayed(Duration(seconds: 1));
    mytext=mytext+"\n"+"Completed Task1";
    setMyTextState(mytext);
    await Future.delayed(Duration(seconds: 1));
    mytext=mytext+"\n"+"Completed Task2";
    setMyTextState(mytext);
  }catch(e){
    print('failed: ${e.toString()}');
  }
}

答案是:

Started
--- 1 second ---
Completed Task1
--- 2 second ---
Completed Task2

先輸出 ”Start“, 然后過一秒备韧,輸出 ”Completed Task1“ 再過一秒輸出 ”Completed Task2“ 博投。

如果把方法里的 await 去掉,看看會(huì)發(fā)生什么呢盯蝴,結(jié)果是毅哗,Task1 和 Task2不會(huì)等待Future.delayed 完成,會(huì)直接執(zhí)行捧挺。

Started
Completed Task1
Completed Task2
--- 1 second ---

測(cè)試調(diào)用 async 方法時(shí)虑绵,代碼的執(zhí)行順序問題

那如果說,代碼依次是 Task1, Task2, Task3, Task4, Task2 是一個(gè)異步的方法闽烙,Task3 , Task4 需要等待 Task2 完成嗎翅睛?

代碼如下:

Future<void> asyncAwaitWithTask() async{
  mytext="Started";
  setMyTextState(mytext);
  try{
    // 這里沒有 .then, 要加 await, await 是說在 await 完成前別往下執(zhí)行
    await Future.delayed(Duration(seconds: 1));
    mytext=mytext+"\n"+"Completed Task1";
    setMyTextState(mytext);
    task2();
    mytext=mytext+"\n"+"Completed Task3";
    setMyTextState(mytext);
    mytext=mytext+"\n"+"Completed Task4";
    setMyTextState(mytext);
  }catch(e){
    print('failed: ${e.toString()}');
  }
}

void task2() async{
  await Future.delayed(Duration(seconds: 1));
  mytext=mytext+"\n"+"Completed Task2";
  setMyTextState(mytext);
}

答案是, Task3, Task4 會(huì)先于 Task2 執(zhí)行,最前面的 GIF 圖就是在運(yùn)行的這個(gè)場(chǎng)景黑竞。

Started
--- 1 second ---
Completed Task1
Completed Task3
Completed Task4
--- 2 second ---
Completed Task2

Flutter 學(xué)習(xí)之路 Github 地址

https://github.com/draftbk/flutter_road

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末捕发,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子很魂,更是在濱河造成了極大的恐慌扎酷,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,104評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件遏匆,死亡現(xiàn)場(chǎng)離奇詭異法挨,居然都是意外死亡谁榜,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門凡纳,熙熙樓的掌柜王于貴愁眉苦臉地迎上來窃植,“玉大人,你說我怎么就攤上這事荐糜∠锪” “怎么了?”我有些...
    開封第一講書人閱讀 168,697評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵暴氏,是天一觀的道長延塑。 經(jīng)常有香客問我,道長偏序,這世上最難降的妖魔是什么页畦? 我笑而不...
    開封第一講書人閱讀 59,836評(píng)論 1 298
  • 正文 為了忘掉前任,我火速辦了婚禮研儒,結(jié)果婚禮上豫缨,老公的妹妹穿的比我還像新娘。我一直安慰自己端朵,他們只是感情好好芭,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,851評(píng)論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著冲呢,像睡著了一般舍败。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上敬拓,一...
    開封第一講書人閱讀 52,441評(píng)論 1 310
  • 那天邻薯,我揣著相機(jī)與錄音,去河邊找鬼乘凸。 笑死厕诡,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的营勤。 我是一名探鬼主播灵嫌,決...
    沈念sama閱讀 40,992評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼葛作!你這毒婦竟也來了寿羞?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,899評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤赂蠢,失蹤者是張志新(化名)和其女友劉穎绪穆,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,457評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡霞幅,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,529評(píng)論 3 341
  • 正文 我和宋清朗相戀三年漠吻,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了量瓜。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片司恳。...
    茶點(diǎn)故事閱讀 40,664評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖绍傲,靈堂內(nèi)的尸體忽然破棺而出扔傅,到底是詐尸還是另有隱情,我是刑警寧澤烫饼,帶...
    沈念sama閱讀 36,346評(píng)論 5 350
  • 正文 年R本政府宣布猎塞,位于F島的核電站,受9級(jí)特大地震影響杠纵,放射性物質(zhì)發(fā)生泄漏荠耽。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,025評(píng)論 3 334
  • 文/蒙蒙 一比藻、第九天 我趴在偏房一處隱蔽的房頂上張望铝量。 院中可真熱鬧,春花似錦银亲、人聲如沸慢叨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽拍谐。三九已至,卻和暖如春馏段,著一層夾襖步出監(jiān)牢的瞬間轩拨,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評(píng)論 1 272
  • 我被黑心中介騙來泰國打工院喜, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留亡蓉,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,081評(píng)論 3 377
  • 正文 我出身青樓够坐,卻偏偏與公主長得像寸宵,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子元咙,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,675評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • GCD的隊(duì)列有兩種庶香,一種是串行隊(duì)列甲棍,一種是并發(fā)隊(duì)列。 串行隊(duì)列: 任務(wù)按往隊(duì)列里的添加先后順序執(zhí)行赶掖,先進(jìn)先出(FI...
    軟件iOS開發(fā)閱讀 419評(píng)論 0 1
  • 一感猛、前言 上一篇文章iOS多線程淺匯-原理篇中整理了一些有關(guān)多線程的基本概念七扰。本篇博文介紹的是iOS中常用的幾個(gè)多...
    nuclear閱讀 2,053評(píng)論 6 18
  • GCD全稱Grand Central Dispatch,從名稱可以看出GCD就是起到中央調(diào)度的作用陪白。這個(gè)調(diào)度作用就...
    _小沫閱讀 1,037評(píng)論 1 8
  • 一颈走、前言 本篇博文介紹的是iOS中常用的幾個(gè)多線程技術(shù): NSThread GCD NSOperation 由于a...
    和玨貓閱讀 578評(píng)論 0 1
  • 前言 我們所熟悉的前端開發(fā)框架大都是事件驅(qū)動(dòng)的。事件驅(qū)動(dòng)意味著你的程序中必然存在事件循環(huán)和事件隊(duì)列咱士。事件循環(huán)會(huì)不停...
    HowHardCanItBe閱讀 15,206評(píng)論 6 29