EventBus报错:@Subscribe注解不被识别,同代码其他项目正常
解决EventBus报错:Subscriber类无@Subscribe注解的公共方法
先直接戳中你当前的核心问题,再逐个拆解修复方案:
1. 订阅方法的访问修饰符不符合要求
EventBus强制要求带有@Subscribe注解的方法必须是public权限——因为它依赖反射机制来扫描和调用这些方法,private方法会被反射直接忽略,这就是你收到报错的直接原因。
修改你的订阅方法权限:
// 错误写法 @Subscribe private void initRegistration(UserRegisteration reg) { ... } // 正确写法 @Subscribe public void initRegistration(UserRegisteration reg) { ... }
2. 事件类的构造函数命名错误
你的事件类UserRegisteration的构造函数名字写错了!构造函数必须和类名完全一致,否则创建事件对象时会出现逻辑错误(甚至编译报错):
// 错误写法 public EventRegisteration(int type, UserDetails userDetails) { ... } // 正确写法 public UserRegisteration(int type, UserDetails userDetails) { ... }
3. 事件发送时机的额外优化(避免事件丢失)
你当前的代码逻辑是先发送事件,再启动目标Activity:
EventBus.getDefault().post(new UserRegisteration (type, userData)); startActivity(new Intent(MainActivity.this, UserRegisterationActivity.class));
这时候UserRegisterationActivity还未完成注册,发送的事件会直接丢失。如果需要让刚启动的Activity接收这个事件,可以改用Sticky事件:
// 发送时使用postSticky EventBus.getDefault().postSticky(new UserRegisteration (type, userData)); // 订阅时添加sticky=true参数,处理后记得移除避免内存泄漏 @Subscribe(sticky = true) public void initRegistration(UserRegisteration reg) { EventBus.getDefault().removeStickyEvent(UserRegisteration.class); // 你的业务逻辑 switch (reg.getType()) { ... } }
或者调整顺序,先启动Activity,在Activity的onResume回调中再触发事件发送。
关于ProGuard规则的说明
你添加的ProGuard规则是完全正确的,当前崩溃和它无关——debug模式下ProGuard默认不会启用,所以不用怀疑这一点。如果是release模式,确保规则已经正确配置到proguard-rules.pro文件即可。
按照上面的步骤修改后,你的EventBus就能正常工作了。
内容的提问来源于stack exchange,提问作者Alaa AbuZarifa
相关产品推荐
相关产品推荐

