背景:对照EventBus官方文档的实例,创建一个MessageEvent类(传递的数据),创建一个名为FirstAcivity的Activity(数据接收方),创建一个名为SecondActivity的Activity(数据发送方)。
接下来看看具体实现过程
MessageEvent:
public class MessageEvent{ private String name; private String age; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAge() { return age; } public void setAge(String age) { this.age = age; } }
FirstActivity:(这里只贴出主要代码)
@Override protected void onStart() { super.onStart(); EventBus.getDefault().register(this);//EventBus注册 } @Override protected void onStop() { super.onStop(); EventBus.getDefault().unregister(this);//EventBus注册 } //接受数据 @Subscribe(threadMode = ThreadMode.MAIN) public void onMessageEvent(MessageEvent event) { tvData.setText(event.getName() + event.getAge()); }
SecondActivity:
private void initData() { messageEvent = new MessageEvent(); messageEvent.setName("张三"); messageEvent.setAge("18"); } public void onClick(View view) { EventBus.getDefault().post(messageEvent);//发送数据 finish(); }
出现问题:运行程序点击操作后发现没有达到预期效果(没有收到返回值)。
仔细查看Logcat后发现如下图所示的EventBus日志(大概意思就是所没有注册或者取消了注册)
分析:
再Activity的onStart生命周期中实现了注册,而再onStop中实现了注销。
接下来分析一下FirstActivity的生命周期,FirstActivity----点击按钮跳转SecondActivity-----FirstActivity
当跳转到SecondActivity时,FirstActivity执行了onStop(注销),再次返回FirstActivity时执行onStart(注册),
按道理应该时没有问题的。再次仔细观察生命周期如下图,并结合发送数据的代码发现
发送数据的时候FirstActivity的onStart生命周期还没有执行也就是还没有执行注册代码。
实践证明:将
EventBus.getDefault().post(messageEvent);//发送数据
这行代码放到SecondActivity的onStop中运行(也就是再FirstActivity的onStart执行后再发送数据),发现可以接收到数据。
ok,到这就分析完了。
解决:
一劳永逸的解决方法:再onCreate中注册,onDestory中注销。
其他需要注意的是:接收数据的Activity必须是事先存在Activity栈中的(如果FirstActivity--->SecondActivity新启动的一个页面,并且向SecondActivity传值,这时SecondActivity并不能接收到)
传输的数据类型必须为一个对象(如:int需要转换为Integer)