1. 程式人生 > >協議解析中使用EventBus遇到的坑

協議解析中使用EventBus遇到的坑

情景:底層收到一個完整資料包後通過EventBus向外傳遞,在收到該資料包後進行解析成對應的訊息。資料包傳送間隔是10ms。

錯誤:LOG分析表明很多包解析錯誤,且錯誤很奇怪。例如,訊息頭解析後,該條資料還沒解析完,再次收到訊息頭位元組。

分析:經過分析,表明兩個訊息頭位元組不是在同一個執行緒上。進一步確定在收到資料包和解析完成中間,有多個該過程在進行,因而導致解析混亂。但解析過程並沒有使用多執行緒。猜想一是傳送過快,解析速度跟不上。二是每次收到EventBus訊息,自動開了新執行緒。猜想一暫擱置,因為傳送速度貌似並不快。先主要針對猜想二。

解決:通過觀察,接收EventBus訊息的註解@Subscribe(threadMode = ThreadMode.ASYN)存在很大嫌疑。經過測試,使用@Subscribe(threadMode = ThreadMode.MAIN)時問題解決。原因是ThreadMode.ASYN時事件會在單獨的執行緒中執行,每個事件一個執行緒,同步出錯