flutter中的非同步機制Future

2022-06-05 21:36:10 字數 2535 閱讀 9676

dart是乙個單執行緒語言,可以理解成物理線路中的串聯,當其遇到有延遲的運算(比如io操作、延時執行)時,執行緒中按順序執行的運算就會阻塞,使用者就會感覺到卡頓,於是通常用非同步處理來解決這個問題。

dart非同步程式設計有兩種方式:future和stream

future相當於40公尺大砍刀,stream相當於一捆40公尺大砍刀。dart提供了關鍵字async(非同步)和await(延遲執行),相當於普通的便捷的小匕首,而小匕首是我們平時經常用到的。

當遇到有需要延遲的運算(async)時,將其放入到延遲運算的佇列(await)中去,把不需要延遲運算的部分先執行掉,最後再來處理延遲運算的部分。

1、async和await

async await 這兩個關鍵字是dart語言的特性,能讓你寫出看起來像是「同步」的「非同步」**,先看乙個方法案例:

/*http的get請求返回值為future型別,即其返回值未來是乙個string型別的值*/

/*async關鍵字宣告該函式內部有**需要延遲執行*/

getdata() async 

/*載入使用者資訊,順便列印時間看看順序*/

future _loaduserinfo() async");

print(await _getuserinfo());

print("_loaduserinfo:$");

}

我們在initstate中呼叫該方法:

@override

void initstate()");

_loaduserinfo();

print("initstate:$");

super.initstate();

}

列印結果如下:

i/flutter ( 1802): initstate:2019

-06-20

09:46:40.097339

i/flutter ( 1802): _loaduserinfo:2019

-06-20

09:46:40.103542

i/flutter ( 1802): instance of

'future'

i/flutter ( 1802): initstate:2019

-06-20

09:46:40.108510

i/flutter ( 1802): 我是使用者

i/flutter ( 1802): _loaduserinfo:2019

-06-20

09:46:43.117136

what?

很明顯,列印結果並沒有按照串聯的方式依次列印。

flutter中會改造帶asyc關鍵字的方法,讓這個方法脫離主流程,變成「後面一點」執行(通過schedulemicrotask),所以可以讓我們的程式「看起來」是順序執行的。

2.2、future api

我們修改一下 loaduserinfo() 方法:

/*載入使用者資訊,順便列印時間看看順序*/

future _loaduserinfo() async");

_getuserinfo().then((info));

print("_loaduserinfo:$");

}

再次執行輸出一下:

i/flutter ( 1802): initstate:2019

-06-20

09:50:32.488765

i/flutter ( 1802): _loaduserinfo:2019

-06-20

09:50:32.494751

i/flutter ( 1802): _loaduserinfo:2019

-06-20

09:50:32.499725

i/flutter ( 1802): instance of

'future'

i/flutter ( 1802): initstate:2019

-06-20

09:50:32.499970

i/flutter ( 1802): 我是使用者

兩次輸出是有不同的,主要不同在於第二個 loaduserinfo 的日誌列印,與『我是使用者』的輸出順序,為什麼有差異?

await會阻塞流程,等待緊跟著的的future執行完畢之後,再執行下一條語句,而如果用了future.then這個api,那麼就不會等待,直接執行下面的語句,等future執行完了,再呼叫then這個方法。

3、總結

在請求方法中直接 return await .. .的時候,實際上返回的是乙個延遲計算的future物件。

有兩點需要注意:

flutter 中有兩種實現非同步程式設計的方式:future api、 async await

日常開發中常用的是 async await future 搭配。

linux中同步和非同步機制

一.併發控制 1 自旋鎖 得不到資源,會原地打轉,直到獲得資源為止 定義自旋鎖 spinlock t spin 初始化自旋鎖 spin lock init lock 獲得自旋鎖 spin lock lock 獲得自旋鎖,如果能立即獲得,則馬上返回,否則自旋在那裡,直到該自旋鎖的保持者釋放 spin ...

React中setState為非同步機制

setstate用來更改state,並觸發render方法重新渲染頁面,這之間要經過react核心中diff演演算法比較dom樹,最終決定是否需要被渲染如何渲染。如何在第一時間獲取並應用setstate的值,set完第一時間呼叫方法即可獲取 如 this.setstate nowstate 便利 1...

linux裝置驅動中的非同步通知機制

非同步通知的意思是 一旦裝置就緒,則主動通知應用程式,這樣應用程式根本就不需要查詢裝置狀態,這一點非常類似於硬體上 中斷 的概念,比較準確的稱謂是 訊號驅動的非同步i o 訊號是在軟體層次上對中斷機制的一種模擬,在原理上,乙個程序收到乙個訊號與處理器收到乙個中斷請求可以說是一樣的.訊號是非同步的,乙...