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 訊號是在軟體層次上對中斷機制的一種模擬,在原理上,乙個程序收到乙個訊號與處理器收到乙個中斷請求可以說是一樣的.訊號是非同步的,乙...