【问题标题】:EventBus Unable to start activityEventBus 无法启动活动
【发布时间】:2018-05-11 10:32:01
【问题描述】:

我正在构建一个 Android 应用,我想将一个 EventBus 从我的 Service 类发送到我的 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 类中的代码:

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 类中的错误 ID onStart 方法。

//编辑

我添加了我的 MessageEvent 类:

public class MessageEvent {
    public final String message;

    public MessageEvent(String message) {
        this.message = message;
    }
}

【问题讨论】:

  • 你在使用 proGuard 吗?
  • 请发布您的 MessageEvent 课程
  • 不,我不使用 proGuard。我在我的 gradle 文件中插入了这一行代码: implementation 'org.altbeacon:android-beacon-library:2+'

标签: android event-bus


【解决方案1】:

下面的代码最终完美运行

您要接收事件的活动代码

@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
  }

服务类中的代码

EventBus.getDefault().post(new MessageEvent("event"));

您必须在注册和注销事件总线中传递当前的 类实例

【讨论】:

    【解决方案2】:

    所以你在这里做错了一些事情......

    首先,查看Androids activity lifecycle,如果您在onStart() 中注册了某些内容,那么您应该在onStop() 中注销它,如果您在onResume() 中注册某些内容,您应该在onPause() 中注销它。否则,你在activity启动时注册它,但当用户将应用程序放入后台一段时间后,它会取消注册,并且不会再次注册,因为应用程序尚未启动,它刚刚恢复。

    其次,如果您查看EventBus GitHub,您应该注册的是 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 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);
    }
    

    【讨论】:

    • 能否用您使用的 EventBus 版本更新您的问题。我会用更多关于 proguard 的信息来更新我的答案。
    【解决方案3】:

    从异常消息中可以看出,您尝试在 BLEActivity 中注册 EventBus,同时将 BlePowerService 传递给可能没有 @Subscribe 注释的 EventBus.getDefault().register();

    你应该试试

    @Override
    public void onStart() {
        super.onStart();
        EventBus.getDefault().register(this);
    }
    
    @Override
    public void onStop() {
        super.onStart();
        EventBus.getDefault().unregister(this);
    }
    

    BLEActivity 内,因为此活动具有@Subscribe 注释。

    【讨论】:

      【解决方案4】:

      尝试注册

       @Override
          public void onCreate() {
              super.onCreate();
              EventBus.getDefault().register(BlePowerService.class);
          }
      

      然后注销

       @Override
          public void onDestroy() {
      
              super.onDestroy();
              EventBus.getDefault().unregister(BlePowerService.class);
          }
      

      在所有其他方法中删除。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-07-08
        • 2012-11-23
        • 2017-09-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多