EventBus 无法启动 activity
EventBus Unable to start activity
我正在构建一个应用程序 Android,我想从我的服务 class 发送一个 EventBus 到我的 Activity。
所以这是我的 activity 代码:
@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 中的代码 class:
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
我的 Activity class.
中的错误 ID onStart 方法
//编辑
我添加我的 MessageEvent class:
public class MessageEvent {
public final String message;
public MessageEvent(String message) {
this.message = message;
}
}
从异常消息中可以看出,您正在尝试在 BLEActivity
中注册 EventBus
,同时将 BlePowerService
传递给 EventBus.getDefault().register();
,这可能没有@Subscribe
注释。
你应该试试
@Override
public void onStart() {
super.onStart();
EventBus.getDefault().register(this);
}
@Override
public void onStop() {
super.onStart();
EventBus.getDefault().unregister(this);
}
在 BLEActivity
里面,因为这个 activity 有 @Subscribe
注释。
下面的代码在我这边工作得很好
Activity 您想要接收事件的代码
@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 your code
}
服务代码class
EventBus.getDefault().post(new MessageEvent("event"));
您必须在注册和取消注册 事件总线中传递当前 class 实例。
尝试在
中注册
@Override
public void onCreate() {
super.onCreate();
EventBus.getDefault().register(BlePowerService.class);
}
并在
注销
@Override
public void onDestroy() {
super.onDestroy();
EventBus.getDefault().unregister(BlePowerService.class);
}
在所有其他方法中删除。
所以你在这里做错了一些事情...
首先,查看 Androids activity lifecycle,如果您在 onStart()
中注册了一些东西,您应该在 onStop()
中取消注册,如果您在 onResume()
中注册了一些东西,您应该然后在 onPause()
中注销它。否则,你在 activity 启动时注册了它,但是当用户将应用程序放入后台一段时间时,它会取消注册,并且不会再次注册,因为应用程序尚未启动,它刚刚恢复.
其次,如果您查看 EventBus GitHub,您应该注册 Activity 而不是 class。
这是一个例子:
@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 rules 来防止订阅者从您的代码中删除:
-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);
}
我正在构建一个应用程序 Android,我想从我的服务 class 发送一个 EventBus 到我的 Activity。
所以这是我的 activity 代码:
@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 中的代码 class:
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
我的 Activity class.
中的错误 ID onStart 方法//编辑
我添加我的 MessageEvent class:
public class MessageEvent {
public final String message;
public MessageEvent(String message) {
this.message = message;
}
}
从异常消息中可以看出,您正在尝试在 BLEActivity
中注册 EventBus
,同时将 BlePowerService
传递给 EventBus.getDefault().register();
,这可能没有@Subscribe
注释。
你应该试试
@Override
public void onStart() {
super.onStart();
EventBus.getDefault().register(this);
}
@Override
public void onStop() {
super.onStart();
EventBus.getDefault().unregister(this);
}
在 BLEActivity
里面,因为这个 activity 有 @Subscribe
注释。
下面的代码在我这边工作得很好
Activity 您想要接收事件的代码
@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 your code
}
服务代码class
EventBus.getDefault().post(new MessageEvent("event"));
您必须在注册和取消注册 事件总线中传递当前 class 实例。
尝试在
中注册 @Override
public void onCreate() {
super.onCreate();
EventBus.getDefault().register(BlePowerService.class);
}
并在
注销 @Override
public void onDestroy() {
super.onDestroy();
EventBus.getDefault().unregister(BlePowerService.class);
}
在所有其他方法中删除。
所以你在这里做错了一些事情...
首先,查看 Androids activity lifecycle,如果您在 onStart()
中注册了一些东西,您应该在 onStop()
中取消注册,如果您在 onResume()
中注册了一些东西,您应该然后在 onPause()
中注销它。否则,你在 activity 启动时注册了它,但是当用户将应用程序放入后台一段时间时,它会取消注册,并且不会再次注册,因为应用程序尚未启动,它刚刚恢复.
其次,如果您查看 EventBus GitHub,您应该注册 Activity 而不是 class。
这是一个例子:
@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 rules 来防止订阅者从您的代码中删除:
-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);
}