Время от времени я получаю это исключение.

Я просто использую green-robot стандартным способом, между представлениями, фрагментами, действиями, службами и приложением, с экземпляром по умолчанию и время от времени с некоторыми stickyEvents.

Я не нашел других сообщений, связанных с этим исключением. Есть идеи или намек на то, чтобы начать расследование?

Шина событий работает нормально (~ 20 событий, 10 подписчиков), все запускается пользователем, поэтому нет большой нагрузки на поле.

Полная трассировка стека находится здесь:

de.greenrobot.event.EventBusException: Invoking subscriber failed
10-27 15:37:00.522 25414-25414/fr.tech.app..u E/AndroidRuntime:     at de.greenrobot.event.EventBus.handleSubscriberException(EventBus.java:518)
10-27 15:37:00.522 25414-25414/fr.tech.app..u E/AndroidRuntime:     at de.greenrobot.event.EventBus.invokeSubscriber(EventBus.java:500)
10-27 15:37:00.522 25414-25414/fr.tech.app..u E/AndroidRuntime:     at de.greenrobot.event.EventBus.postToSubscription(EventBus.java:429)
10-27 15:37:00.522 25414-25414/fr.tech.app..u E/AndroidRuntime:     at de.greenrobot.event.EventBus.postSingleEventForEventType(EventBus.java:410)
10-27 15:37:00.522 25414-25414/fr.tech.app..u E/AndroidRuntime:     at de.greenrobot.event.EventBus.postSingleEvent(EventBus.java:383)
10-27 15:37:00.522 25414-25414/fr.tech.app..u E/AndroidRuntime:     at de.greenrobot.event.EventBus.post(EventBus.java:263)
10-27 15:37:00.522 25414-25414/fr.tech.app..u E/AndroidRuntime:     at fr.u.app.u.Dialog.TastingNavigationDialog$1.onSelection(TastingNavigationDialog.java:42)

Ошибка запускается из экземпляра MaterialDialog:

  dialogBuilder = new MaterialDialog.Builder(context)
            .title(R.string.dialogTastingNavigationTripTitle)
            .negativeText(R.string.buttonCancel)
            .cancelable(false)
            .adapter(listAdapter, new MaterialDialog.ListCallback() {
                @Override
                public void onSelection(MaterialDialog dialog, View itemView, int which, CharSequence text) {
                    EventBus.getDefault().post(new TastingPageToEvent(listAdapter.list.get(which), which));
                    dialog.dismiss();
                }
            });

Изменить

Я обнаружил, что одна вещь, которая вызывает исключение, - это публикация одного stickyEvent из одного фрагмента. Предполагается, что появившийся в ближайшее время фрагмент сможет вернуть это липкое событие.

При переходе к источнику Eventbus он останавливается в:

   void invokeSubscriber(Subscription subscription, Object event) {
        try {
            subscription.subscriberMethod.method.invoke(subscription.subscriber, event);
        } catch (InvocationTargetException e) {
            handleSubscriberException(subscription, event, e.getCause());
        } catch (IllegalAccessException e) {
            throw new IllegalStateException("Unexpected exception", e);
        }
    }

Изменить

Вот сценарий.

public class TopEvent {
    String name;
    public TopEvent(String name){
        this.name = name;
    }
}

public class MyEvent extends TopEvent {
    String extraInfo;
    public MyEvent(String name, String extra){
        super(name);
        this.extraInfo = extra; 
    }
}

Вот один фрагмент Tx:

...
EventBus.getDefault().postStickyEvent(new MyEvent("Stack","Overflow");
...

Вот второй фрагмент Rx

...
String extra = EventBus.getDefault().getStickyEvent(MyEvent.class).extraInfo;
...

Вот сервис (тот, у которого странное поведение)

public class MyService extends Service {

    ...

    EventBus.getDefault().registerSticky(this)

    onEvent(TopEvent event){
       ...
       ...
    }

}

В конце onEvent создается исключение. Как если бы это было какое-то скрытое поведение с опубликованным прикрепленным расширенным событием (от супер), которое запускает неприлипающее событие супер-события.

0
Anthony 27 Окт 2015 в 17:51

2 ответа

Лучший ответ

Это произошло из-за конфигурации EventBus:

EventBus.builder().throwSubscriberException(BuildConfig.DEBUG).installDefaultEventBus();

Однако мне сложно понять, чем интересен этот вариант. Фактически, мы видим только (почти) исключение для подписчика, который потерпел неудачу, потому что было еще одно исключение для подписчика. Но часто это скрыто. Так почему это интересно?

2
Anthony 17 Ноя 2015 в 12:34

Вы должны проверить метод onEvent, который улавливает ваше событие, что там произошло что-то не так, и шина событий выдает это исключение.

1
BoshRa 24 Янв 2017 в 13:05