使用EventBus遇到的問(wèn)題:同一訂閱事件多次執(zhí)行

今天嘗試使用EventBus來(lái)完成Actvity之間的信息傳遞。

應(yīng)用場(chǎng)景很簡(jiǎn)單:由MainActivity向LocationActivity跳轉(zhuǎn),在LocationActivity中完成定位功能,并將定位信息傳遞給MainActivity。

按照一般網(wǎng)上的教程,在MainActivity的onCreate()方法中注冊(cè),在onDestroy()方法中取消注冊(cè)。當(dāng)然還有訂閱事件,這里我用的onEventMainThread()方法。

但是發(fā)現(xiàn),經(jīng)過(guò)N次跳轉(zhuǎn)之后,發(fā)現(xiàn)onEventMainThread()方法會(huì)執(zhí)行N次。

原因:在LocationActivity中發(fā)布事件之后,用了startActivity()方法重新回到MainActivity,這樣MainActivity就會(huì)再次從onCreate()執(zhí)行,導(dǎo)致EventBus重復(fù)注冊(cè)。EventBus的注冊(cè),意味著將注冊(cè)者(我這里就是MainActivity)中所有的訂閱事件保存起來(lái),這種保存是放在一個(gè)HashMap中的,允許重復(fù)元素,多次訂閱就導(dǎo)致訂閱事件多次保存。而在發(fā)布事件之后,在這個(gè)HashMap中就會(huì)找到多個(gè)相同的訂閱事件,這些訂閱事件都會(huì)得到執(zhí)行。

解決辦法:在LocationActivity中跳轉(zhuǎn)時(shí),直接finish(),讓MainActivity從restart()方法開始執(zhí)行,就不會(huì)多次注冊(cè)了。

問(wèn)題原因:對(duì)startActivity之后的Activity的生命周期過(guò)程模糊;對(duì)EventBus注冊(cè)的實(shí)現(xiàn)方式和原理不清楚。

僅供參考。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容