Bloc事件流是一個(gè)阻塞隊(duì)列結(jié)論解析
前言
在Flutter中有state的概念,我們使用Bloc進(jìn)行狀態(tài)管理,通過Bloc.addEvent的方式進(jìn)行事件傳遞,狀態(tài)變更。關(guān)于Bloc的基礎(chǔ)用法,可以查閱Bloc官網(wǎng)相關(guān)資料,這里我們僅記錄一下Bloc的隊(duì)列等待。
新建一個(gè)Bloc類
class TestBloc extends Bloc<TestEvent, TestState> { TestBloc() : super(new TestState()); @override Stream<TestState> mapEventToState(TestEvent event) async* { if (event is TestEventA) { print("A"); await Future.delayed(Duration(seconds: 2)); print("finish A await"); } else if (event is TestEventB) { print("B"); } } } abstract class TestEvent {} class TestEventA extends TestEvent {} class TestEventB extends TestEvent {} class TestState {}
如上,定義了一個(gè)最基礎(chǔ)的Bloc,事件A,事件B。我們接收到事件A后延時(shí)等待了2秒鐘,用于驗(yàn)證Bloc的Event Loop是否具有阻塞性。
新建一個(gè)頁面main.dart, 添加按鈕事件,同時(shí)給bloc發(fā)送事件A和事件B:
//...省略非關(guān)鍵代碼 onPressed: (){ _bloc.add(TestEventA()); _bloc.add(TestEventB()); }
現(xiàn)象:
print("A") 打印后,等待了2秒,打印 "finish A await", 然后才響應(yīng)到事件B的觸發(fā)。
結(jié)論:
Bloc 的 event 隊(duì)列是一個(gè)阻塞性隊(duì)列,先進(jìn)先出,只有當(dāng)上一個(gè)事件消費(fèi)完畢后,才會(huì)觸發(fā)響應(yīng)隊(duì)列中的下一個(gè)事件。
解釋開發(fā)中所遇到的問題現(xiàn)象
在 await 前面 addEvent,會(huì)阻塞線程,造成事件的接收延時(shí),但在await前面 yeild 不受影響,可以在延時(shí)前收到狀態(tài)變更
Stream隊(duì)列是否也是有序的?
通過代碼測試,流內(nèi)消息體的順序與加入的順序無關(guān),與消息體本身的耗時(shí)正相關(guān)。
以上就是Bloc事件流是一個(gè)阻塞隊(duì)列結(jié)論解析的詳細(xì)內(nèi)容,更多關(guān)于Bloc 事件流阻塞隊(duì)列的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
教新手使用java如何對一個(gè)大的文本文件內(nèi)容進(jìn)行去重
用HashSet對內(nèi)容去重這個(gè)過程jvm會(huì)內(nèi)存溢出,只能首先將這個(gè)大文件中的內(nèi)容讀取出來,對每行String的hashCode取模取正整數(shù),可用取模結(jié)果作為文件名,將相同模數(shù)的行寫入同一個(gè)文件,再單獨(dú)對每個(gè)小文件進(jìn)行去重,最后再合并2021-06-06Spring Boot 防止接口惡意刷新和暴力請求的實(shí)現(xiàn)
本文主要介紹了Spring Boot 防止接口惡意刷新和暴力請求的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06解決Spring Boot 在localhost域奇怪的404問題(Mac book pro)
這篇文章主要介紹了解決Spring Boot 在localhost域奇怪的404問題(Mac book pro),需要的朋友可以參考下2017-09-09使用@PathVariable時(shí)候無法將參數(shù)映射到變量中的解決
這篇文章主要介紹了使用@PathVariable時(shí)候無法將參數(shù)映射到變量中的解決方案,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08詳解rabbitmq使用springboot實(shí)現(xiàn)fanout模式
這篇文章主要介紹了rabbitmq使用springboot實(shí)現(xiàn)fanout模式,Fanout特點(diǎn)是發(fā)布與訂閱模式,是一種廣播機(jī)制,它是沒有路由key的模式,需要的朋友可以參考下2023-07-075分鐘讓你快速掌握java8 stream常用開發(fā)技巧
這篇文章主要給大家介紹了關(guān)于java8 stream常用開發(fā)技巧的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12