Android开发:Service向Activity发送EventBus启动报错求助
解决EventBus注册报错:Subscriber class has no public methods with @Subscribe annotation
嘿,这个错误的根源太明显了——你在BLEActivity里的EventBus注册逻辑完全写错了!
错误原因分析
你在onStart()方法里调用了:
EventBus.getDefault().register(BlePowerService.class);
EventBus要求注册的是订阅者的实例(也就是当前的BLEActivity对象),而你传的是BlePowerService.class这个Class对象。EventBus会尝试扫描这个Class类的方法,自然找不到带@Subscribe注解的方法,所以抛出了这个异常。而且BlePowerService是事件的发布者,根本不需要在这里注册它。
具体修复步骤
修正注册与反注册逻辑
把注册和反注册的参数改成当前Activity的实例this,同时注意不要重复反注册(比如你现在在onPause和onDestroy都调用了unregister,会导致二次反注册报错),建议只在onDestroy里反注册,或者加个判断:@Override public void onStart() { super.onStart(); // 注册当前Activity作为订阅者 EventBus.getDefault().register(this); } @Override protected void onDestroy() { super.onDestroy(); // 只在销毁时反注册一次,避免重复反注册报错 if (EventBus.getDefault().isRegistered(this)) { EventBus.getDefault().unregister(this); } }清理过时的事件处理方法
你代码里的onEvent(MessageEvent event)是EventBus 2.x的旧写法,现在用3.x+版本的@Subscribe注解,直接删掉这个方法,保留你已经写好的带注解的方法即可:@Subscribe(threadMode = ThreadMode.MAIN) public void getEventBusData(MessageEvent messageEvent) { if (messageEvent != null) { // 在这里处理收到的事件,比如更新UI Log.d("EventBus", "收到消息: " + messageEvent.message); } }确认发布逻辑正常
BlePowerService里的事件发布代码是正确的,不需要修改:EventBus.getDefault().post(new MessageEvent("update"));
额外注意事项
- 确保你引入的是GreenRobot的EventBus 3.x+版本(从注解的写法来看你已经用对了);
@Subscribe注解的方法必须是public的(你已经满足了);- 如果需要在后台线程处理事件,可以修改
threadMode参数,比如ThreadMode.BACKGROUND。
内容的提问来源于stack exchange,提问作者bircastri
相关产品推荐
相关产品推荐

