今天嘗試使用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)方式和原理不清楚。
僅供參考。