以前写eventbus按照文档来就行了,昨天测试微信支付时发现,返回时候总是出现
org.greenrobot.eventbus.EventBusException: Subscriber class xxx(自己的类)$1 and its super classes have no public methods with the @Subscribe annotation
检查时发现都是正确的,注册的地方注册了
1、猜测原因可能是重复注册,于是修改注册和注销
if (!EventBus.getDefault().isRegistered(this)) {
EventBus.getDefault().register(this);
}
还是错误
猜测就是跳转或传递值到下一个Activity的时候在EventBus注册之前,消息已经发送了,因此才会出现上面的错误
2、解决办法
使用粘性发送消息的方式,粘性发送消息的意思是如果没有接收到消息还会继续发送最新发送过的消息
EventBus.getDefault().postSticky(new Messent("2","",""));
当然在接收的时候指定方式sticky = true;如@Subscribs(sticky = true),就可以解决上面的问题。
但是再次操作还是有问题,继续跟踪问题,可能还是重复注册了
3、解决办法
易犯错点,在onCreate里面注册,然后onDestory注销,这样注册跳转到另一页再回来时就会重复注册,会报错的
解决办法,在onStart里面注册,然后onStop注销,注销怕重复注册可以使用flag
在你需要传递的Activity里面EventBus.getDefault().postSticky(new Messent("2","",""));
在你需要接收的Activity界面
需要接受消息的Activity界面如下写法
boolean flag= true; @Override protected void onStart() { if(flag){ //4. EventBus注册广播(),参数是上下文. 导入的EventBus请认准org.greenrobot //注意:有注册就必须有解注册(一般在OnDestroy里执行解注册操作),防止内存泄漏,注册一个界面只能注册一次,否则报错 EventBus.getDefault().register(this); //更改标记,使其不会再进行注册,多次注册会报错 flag = false; } super.onStart(); }
在onStop里面注销
@Override protected void onStop() { EventBus.getDefault().removeAllStickyEvents(); //解除注册 EventBus.getDefault().unregister(this); super.onStop(); }
在你需要接受消息的地方写
需要注意的是一定要写sticky = true
@Subscribe(threadMode = ThreadMode.MAIN,sticky = true) public void onEvent(Messent messageEvent) { if (messageEvent.getMessage().equals("1")){ Http.getJoin(basicPreferences.getString("userName", ""), "", basicPreferences.getString("userName", ""), id, "android", new Callback.CacheCallback<String>() { @Override public boolean onCache(String result) { return false; } @Override public void onSuccess(String result) { if (result != null && !result.isEmpty()) { JSONObject object = JSON.parseObject(result); if ("success".equalsIgnoreCase(object.getString("flag"))) { } } } @Override public void onError(Throwable ex, boolean isOnCallback) { } @Override public void onCancelled(CancelledException cex) { } @Override public void onFinished() { } }); }else{ Toast.makeText(this, "支付失败", Toast.LENGTH_LONG).show(); finish(); } }
最终解决问题