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);
}