實(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