今天嘗試使用EventBus來完成Actvity之間的信息傳遞。
應(yīng)用場景很簡單:由MainActivity向LocationActivity跳轉(zhuǎn),在LocationActivity中完成定位功能码泞,并將定位信息傳遞給MainActivity。
按照一般網(wǎng)上的教程茸歧,在MainActivity的onCreate()方法中注冊罗标,在onDestroy()方法中取消注冊。當(dāng)然還有訂閱事件获枝,這里我用的onEventMainThread()方法蠢正。
但是發(fā)現(xiàn),經(jīng)過N次跳轉(zhuǎn)之后省店,發(fā)現(xiàn)onEventMainThread()方法會執(zhí)行N次嚣崭。
原因:在LocationActivity中發(fā)布事件之后笨触,用了startActivity()方法重新回到MainActivity,這樣MainActivity就會再次從onCreate()執(zhí)行雹舀,導(dǎo)致EventBus重復(fù)注冊芦劣。EventBus的注冊,意味著將注冊者(我這里就是MainActivity)中所有的訂閱事件保存起來说榆,這種保存是放在一個(gè)HashMap中的持寄,允許重復(fù)元素,多次訂閱就導(dǎo)致訂閱事件多次保存娱俺。而在發(fā)布事件之后稍味,在這個(gè)HashMap中就會找到多個(gè)相同的訂閱事件,這些訂閱事件都會得到執(zhí)行荠卷。
解決辦法:在LocationActivity中跳轉(zhuǎn)時(shí)模庐,直接finish(),讓MainActivity從restart()方法開始執(zhí)行油宜,就不會多次注冊了掂碱。
問題原因:對startActivity之后的Activity的生命周期過程模糊;對EventBus注冊的實(shí)現(xiàn)方式和原理不清楚慎冤。
僅供參考疼燥。