EventBus Невозможно начать деятельность - PullRequest
0 голосов
/ 11 мая 2018

Я создаю приложение 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

Метод onStart с идентификатором ошибки из моего класса Activity.

// EDIT

Я добавляю свой класс MessageEvent:

public class MessageEvent {
    public final String message;

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

Ответы [ 4 ]

0 голосов
/ 11 мая 2018

Итак, вы сделали несколько вещей неправильно ...

Сначала, глядя на жизненный цикл активности Android , если вы регистрируете что-то в onStart(), вам следует отменить регистрацию в onStop(), а если вы регистрируете что-то в onResume(), то вам следует отменить регистрацию в onPause(). В противном случае вы регистрируете его, когда начинается действие, но когда пользователь на некоторое время помещает приложение в фоновый режим, оно отменяет регистрацию и не регистрируется снова, так как приложение не запущено, оно только что возобновилось.

Во-вторых, если вы посмотрите на 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 , которые мы можем использовать для предотвращения удаления подписчиков из вашего кода:

-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);
}
0 голосов
/ 11 мая 2018

Код ниже работает отлично в моем конце

Код активности, где вы хотите получить событие

@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"));

Вы должны передать текущий экземпляр класса в регистр и отменить регистрацию eventbus.

0 голосов
/ 11 мая 2018

Попробуйте зарегистрироваться в

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

и отмените регистрацию в

 @Override
    public void onDestroy() {

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

удалить другим способом.

0 голосов
/ 11 мая 2018

Как это выглядит из сообщения об исключении, вы пытаетесь зарегистрировать EventBus внутри BLEActivity, когда вы передаете 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, так как это действие имеет аннотацию @Subscribe.

...