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