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

背景:对照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)


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值