Исключение EventBus при сборке проекта - у класса подписчика нет общедоступных методов, называемых onEvent

Итак, мое приложение обменивается сообщениями с/на мою MainActivity в/из фоновой службы, и я использовал EventBus для справиться с этим. Я регистрирую оба компонента с помощью

EventBus.getDefault().register(this);

на их onCreates. И я отправляю/получаю событие с помощью:

EventBus.getDefault().post(new MyMessagePojo("message"));

и

public void onEvent(MyMessagePojo event) { ... }

Все работает хорошо, когда я запускаю проект из AndroidStudio прямо на свой тестовый телефон. Однако, когда я сгенерировал подписанный APK, я установил приложение и получил сбой со следующим исключением:

Subscriber class my.package.MainActivity has no public methods called onEvent

Где явно есть. Я попытался изменить его с onEvent на onEventMainThread в своей MainActivity, но безуспешно. Это довольно неприятно, так как я собирался опубликовать приложение, а теперь не могу решить эту проблему.

Я прошел через это и this, но они не помогли.

Любые идеи?


person Teo Inke    schedule 16.06.2015    source источник
comment
Ваша конфигурация ProGuard, вероятно, переименовывает onEvent(), так как считает, что переименовывать безопасно. Настройте конфигурацию ProGuard вашего проекта, чтобы сохранить этот метод.   -  person CommonsWare    schedule 16.06.2015
comment
У вас есть какие-либо инструкции / ссылки для этого? Я еще не знаком с конфигурациями ProGuard   -  person Teo Inke    schedule 16.06.2015
comment
Что ты имеешь в виду? В конце концов, я просто отключил proguard, и, похоже, в этом нет большой разницы.   -  person Teo Inke    schedule 29.07.2015


Ответы (2)


Это рассматривается в документации EventBus HOWTO. https://github.com/greenrobot/EventBus/blob/master/HOWTO.md

Используйте приведенный ниже код, чтобы сохранить только функции onEvent.

-keepclassmembers class ** {
    public void onEvent*(**);
}
person han4wluc    schedule 27.09.2015
comment
Спасибо! Ваш ответ помог :) - person Zohair; 08.01.2016

Так что мне удалось сохранить этот метод, добавив в ProGuard следующую конфигурацию:

-keep public class my.package.MainActivity {
    public <methods>;
}

Тем не менее, ProGuard портит еще больше вещей в моем приложении. Я даже не могу войти в свое приложение (и я не знаю почему, я просто сразу получаю предупреждение о проблеме с сетью). Я серьезно подумываю отключить его.

person Teo Inke    schedule 16.06.2015