首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >EventBus无法启动活动

EventBus无法启动活动
EN

Stack Overflow用户
提问于 2018-05-11 10:32:01
回答 3查看 1.5K关注 0票数 0

我正在构建一个应用程序Android,我想从我的服务类发送一个EventBus到我的活动。

这是我的活动代码:

代码语言:javascript
复制
    @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类中的代码:

代码语言:javascript
复制
EventBus.getDefault().post(new MessageEvent("update"));

如果我试图启动我的应用程序,就会出现以下错误:

代码语言:javascript
复制
    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类:

代码语言:javascript
复制
public class MessageEvent {
    public final String message;

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

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-05-11 10:50:08

所以你做了一些错事.

首先,查看仙女体活动生命周期,如果您在onStart()中注册了一些东西,那么您应该在onStop()中注销它,如果您在onResume()中注册了一些东西,那么您应该在onPause()中注销它。否则,您在活动开始时注册它,但是当用户将应用程序放到后台稍作准备时,它将被取消注册,它将不会再次注册,因为应用程序尚未启动,它刚刚恢复。

其次,如果您查看EventBus GitHub,您应该注册活动,而不是类。

下面是一个示例:

代码语言:javascript
复制
@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函数:

代码语言:javascript
复制
EventBus.getDefault().post(new MessageEvent("update"));

另外,这可能是您的ProGuard的结果。幸运的是,我们可以使用EventBus ProGuard规则来防止从代码中删除订阅服务器:

代码语言:javascript
复制
-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);
}
票数 1
EN

Stack Overflow用户

发布于 2018-05-11 10:44:32

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

你应该试试

代码语言:javascript
复制
@Override
public void onStart() {
    super.onStart();
    EventBus.getDefault().register(this);
}

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

BLEActivity内部,因为这个活动有@Subscribe注释。

票数 1
EN

Stack Overflow用户

发布于 2018-05-11 10:47:36

试着注册

代码语言:javascript
复制
 @Override
    public void onCreate() {
        super.onCreate();
        EventBus.getDefault().register(BlePowerService.class);
    }

和注销在

代码语言:javascript
复制
 @Override
    public void onDestroy() {

        super.onDestroy();
        EventBus.getDefault().unregister(BlePowerService.class);
    }

在所有其他方法中删除。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50290361

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档