今天尝试使用EventBus来完成Actvity之间的信息传递。
应用场景很简单:由MainActivity向LocationActivity跳转,在LocationActivity中完成定位功能,并将定位信息传递给MainActivity。
按照一般网上的教程,在MainActivity的onCreate()方法中注册,在onDestroy()方法中取消注册。当然还有订阅事件,这里我用的onEventMainThread()方法。
但是发现,经过N次跳转之后,发现onEventMainThread()方法会执行N次。
原因:在LocationActivity中发布事件之后,用了startActivity()方法重新回到MainActivity,这样MainActivity就会再次从onCreate()执行,导致EventBus重复注册。EventBus的注册,意味着将注册者(我这里就是MainActivity)中所有的订阅事件保存起来,这种保存是放在一个HashMap中的,允许重复元素,多次订阅就导致订阅事件多次保存。而在发布事件之后,在这个HashMap中就会找到多个相同的订阅事件,这些订阅事件都会得到执行。
解决办法:在LocationActivity中跳转时,直接finish(),让MainActivity从restart()方法开始执行,就不会多次注册了。
问题原因:对startActivity之后的Activity的生命周期过程模糊;对EventBus注册的实现方式和原理不清楚。
仅供参考。