You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:42:10