我正在构建一个应用程序Android,我想从我的服务类发送一个EventBus到我的活动。
这是我的活动代码:
@Override
protected void onResume() {
super.onResume();
startServiceScan(true);
}
@Override
public void onStart() {
super.onStart();
EventBus.getDefault().register(BlePowerService.class);
}
@Override
protected void onPause() {
EventBus.getDefault().unregister(BlePowerService.class);
super.onPause();
}
@Override
public void onDestroy() {
super.onDestroy();
EventBus.getDefault().unregister(BlePowerService.class);
}
// This method will be called when a HelloWorldEvent is posted
public void onEvent(MessageEvent event){
// your implementation
System.out.print("");
}
@Subscribe(threadMode = ThreadMode.MAIN)
public void getEventBusData(MessageEvent messageEvent) {
if (messageEvent != null) {
//TO-DO
}
}这是我的BlePowerService类中的代码:
EventBus.getDefault().post(new MessageEvent("update"));如果我试图启动我的应用程序,就会出现以下错误:
java.lang.RuntimeException: Unable to start activity
ComponentInfo{com.care.devicesensor/com.care.devicesensor.BLEActivity}:
org.greenrobot.eventbus.EventBusException: Subscriber class java.lang.Class and its super classes have
no public methods with the @Subscribe annotation
...............
Caused by: org.greenrobot.eventbus.EventBusException: Subscriber class java.lang.Class
and its super classes have no public methods with the @Subscribe annotation来自活动类的错误id onStart方法。
//编辑
我添加了我的MessageEvent类:
public class MessageEvent {
public final String message;
public MessageEvent(String message) {
this.message = message;
}
}发布于 2018-05-11 10:50:08
所以你做了一些错事.
首先,查看仙女体活动生命周期,如果您在onStart()中注册了一些东西,那么您应该在onStop()中注销它,如果您在onResume()中注册了一些东西,那么您应该在onPause()中注销它。否则,您在活动开始时注册它,但是当用户将应用程序放到后台稍作准备时,它将被取消注册,它将不会再次注册,因为应用程序尚未启动,它刚刚恢复。
其次,如果您查看EventBus GitHub,您应该注册活动,而不是类。
下面是一个示例:
@Override
public void onStart() {
super.onStart();
EventBus.getDefault().register(this);
}
@Override
public void onStop() {
super.onStop();
EventBus.getDefault().unregister(this);
}
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMessageEvent(MessageEvent event) {
/* Do something */
}现在,您可以在应用程序中的任何地方使用以下代码调用onMessageEvent函数:
EventBus.getDefault().post(new MessageEvent("update"));另外,这可能是您的ProGuard的结果。幸运的是,我们可以使用EventBus ProGuard规则来防止从代码中删除订阅服务器:
-keepattributes *Annotation*
-keepclassmembers class * {
@org.greenrobot.eventbus.Subscribe <methods>;
}
-keep enum org.greenrobot.eventbus.ThreadMode { *; }
# Only required if you use AsyncExecutor
-keepclassmembers class * extends org.greenrobot.eventbus.util.ThrowableFailureEvent {
<init>(java.lang.Throwable);
}发布于 2018-05-11 10:44:32
从异常消息看,当您将EventBus传递给可能没有@Subscribe注释的EventBus.getDefault().register();时,您正在尝试在BLEActivity中注册@Subscribe。
你应该试试
@Override
public void onStart() {
super.onStart();
EventBus.getDefault().register(this);
}
@Override
public void onStop() {
super.onStart();
EventBus.getDefault().unregister(this);
}在BLEActivity内部,因为这个活动有@Subscribe注释。
发布于 2018-05-11 10:47:36
试着注册
@Override
public void onCreate() {
super.onCreate();
EventBus.getDefault().register(BlePowerService.class);
}和注销在
@Override
public void onDestroy() {
super.onDestroy();
EventBus.getDefault().unregister(BlePowerService.class);
}在所有其他方法中删除。
https://stackoverflow.com/questions/50290361
复制相似问题