Android EventBus — отмена регистрации на определенное событие

Я использую EventBus в своем приложении для Android и пытаюсь отменить регистрацию на определенное событие, сохраняя при этом регистрацию на другие события.

Похоже, что метод отмены регистрации принимает в качестве параметра только подписчика, а не событие.

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

Я также проверил Отто, но не похоже, что вы также можете отменить регистрацию на определенном мероприятии.

Любая помощь будет оценена по достоинству.

Спасибо


person Cosmin    schedule 18.03.2015    source источник
comment
AFAIK действительно не имеет понятия об этом ни в одной из библиотек. Просто сохраните boolean isThisEventSomethingToWorryAbout и проверьте его в своем методе обработчика событий перед выполнением своей бизнес-логики, где вы переключаете этот boolean при тех же условиях, что и при отмене регистрации в этом конкретном событии.   -  person CommonsWare    schedule 18.03.2015
comment
Рассмотрите возможность перехода на RxJava или реактивный подход в целом.   -  person Dmitry Zaytsev    schedule 18.03.2015


Ответы (1)


Вы можете добавить этот метод в класс EventBus:

/**
 * Unregisters the given subscriber from a specific event class.
 */
public synchronized void unregister(Object subscriber, Class<?> eventType) {
    List<Class<?>> subscribedTypes = typesBySubscriber.get(subscriber);
    if (subscribedTypes != null && subscribedTypes.contains(eventType)) {
        unubscribeByEventType(subscriber, eventType);
        subscribedTypes.remove(eventType);
        if (subscribedTypes.isEmpty() {
            typesBySubscriber.remove(subscriber);
        }
    } else {
        Log.w(TAG, "Subscriber to unregister was not registered before: " + subscriber.getClass() + " / " + eventType);
    }
}

Это позволяет отменить регистрацию определенного типа события следующим образом:

EventBus.getDefault().unregister(this, MyEvent.class);

Дополнение

Я только что обнаружил, что существует способ сделать именно это, хотя он устарел:

/**
 * @deprecated For simplification of the API, this method will be removed in the future.
 */
@Deprecated
public synchronized void unregister(Object subscriber, Class<?>... eventTypes)
person Emanuel Moecklin    schedule 18.03.2015
comment
Я знаю об этом методе, и я не понимаю, почему они хотят его устареть. Поскольку я хочу зарегистрироваться только на определенное событие, я создал отдельный экземпляр EventBus для этого события. Я не доволен этим подходом, но пока это сработает. - person Cosmin; 19.03.2015