您的位置:首页 > 其它

初步使用EventBus时所遇到的一些问题

2018-03-06 11:05 239 查看

背景:对照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生命周期还没有执
887e
行也就是还没有执行注册代码。
    实践证明:将EventBus.getDefault().post(messageEvent);//发送数据这行代码放到SecondActivity的onStop中运行(也就是再FirstActivity的onStart执行后再发送数据),发现可以接收到数据。
ok,到这就分析完了。

解决:

 一劳永逸的解决方法:再onCreate中注册,onDestory中注销。

其他需要注意的是:接收数据的Activity必须是事先存在Activity栈中的(如果FirstActivity--->SecondActivity新启动的一个页面,并且向SecondActivity传值,这时SecondActivity并不能接收到)
 传输的数据类型必须为一个对象(如:int需要转换为Integer)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: