Удалить слушателя из списка слушателей - PullRequest
0 голосов
/ 25 марта 2019

У меня есть функция, которая добавляет пользовательских прослушивателей к тому же событию триггера.

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

Это моя функция для добавления событий, они находятся в переменной Map<String, CustomListener>.

void addEventListener(String eventName, EventListener eventListener) {
    List<eventListener> eventListenerList = new ArrayList<>();

    if (eventListenerMap.containsKey(eventName)) {
        eventListenerList = eventListenerMap.get(eventName);
    }
    Objects.requireNonNull(eventListenerList).add(eventListener);
    eventListenerMap.put(eventName, eventListenerList);
}

И это моя функция, чтобы удалить

void removeEventListener(String eventName, EventListener eventListener) {
    if (eventListenerMap.containsKey(eventName)) {
        List<InsEventListener> eventListenerList = eventListenerMap.get(eventName);
        assert eventListenerList != null;
        eventListenerList.remove(eventListener);

        eventListenerMap.put(eventName, eventListenerList);
    }
    else {
        Log.w("Remove Event Listener:", "Event not found");
    }
}

Как вы можете видеть на рисунке ниже, он распознает тот же класс с тем же адресом lamba, но не удаляет.

enter image description here

Obs: все слушатели вызываются в одной и той же функции в одном месте

1 Ответ

1 голос
/ 25 марта 2019

Это потому, что eventListenerList.remove(eventListener.getClass()); ничего не удаляет.Вы не должны удалять своих слушателей по их классу, но по индексу или по методу, который отличает их друг от друга.Если вы проверите возвращаемое значение remove(), вы получите false, что означает, что параметр не был в этом списке. документация оракула .

Как правило, объект можно удалить двумя способами из ArrayList (или, как правило, из любого списка), по индексу (remove (int)) и пообъект (удалить (объект)). ссылка здесь

Что нужно сделать:

Добавить метод equals (Object) в ваш класс EventListener.Это позволит вам eventListenerList.remove(eventListener) идентифицировать правильный объект.

Я думаю, что самое простое, что нужно сделать, это добавить атрибут name или id в ваш родительский класс, который будет уникальным для всех ваших слушателей,и переопределить equals, который проверяет эти атрибуты.

Вы можете легко сгенерировать метод equals(object) с помощью Android Studio IDE, нажать Ctrl + O и выбрать метод equals.

EDIT:

Я предлагаю два варианта обработки идентификаторов для ваших слушателей:

  1. Создайте идентификатор самостоятельно в addEventListener и верните его вызывающей стороне, вместо этого сохраните слушателя на картесписка, ключ является идентификатором.Когда кто-то захочет удалить слушателя, он отправит сгенерированный идентификатор, а вы удалите его с карты слушателей события.
  2. Сгенерируйте идентификатор самостоятельно в addEventListener и сохраните его в атрибуте EventListener ID, которыйне может быть изменен кем-либо еще.Затем, чтобы удалить конкретного слушателя, вам нужно только реализовать методы equals, которые проверяют атрибут ID.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...