Android EventBus и базовый класс

Я пытаюсь реализовать некоторую общую логику и реакцию на некоторые события в базовом классе всех моих диалогов.

И регистрация и отмена регистрации в EventBus, и отлов некоторых событий в базовом классе.

Поэтому, когда я попытался создать экземпляр производного класса, EventBus выдает исключение, что DerivedClass не имеет таких методов, как onEvent(*). Я не хочу добавлять какие-то методы-заглушки onEvent в каждый производный класс, так не должно быть при разработке программного обеспечения.

Это так печально, если нет возможности использовать такой подход к наследованию.

Кто-то сталкивался с этим?


person TsimoX    schedule 28.08.2015    source источник


Ответы (2)


Вы можете создать защищенный метод (или абстрактный класс с абстрактным методом) в базовом классе, который вы можете переопределить в дочернем классе (при необходимости) перед регистрацией EvenBus.

public class Test extends Fragment{

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if(doIneedEventBus()){
            EventBus.getDefault().register(this);
        }
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        if(doIneedEventBus()){
            EventBus.getDefault().unregister(this);
        }
    }

    protected boolean doIneedEventBus() {
        return true;
    }
}

Дочерний класс:

public class TestChild extends Test {

    @Override
    protected boolean doIneedEventBus() {
        return false;
    }
}

Второй вариант:

 try {
            EventBus.getDefault().register(this);
        } catch (Throwable t){
            t.printStackTrace();
        }

Или вы можете подождать, пока эта проблема не будет исправлена ​​в библиотеке — https://github.com/greenrobot/EventBus/issues/58

person Mikelis Kaneps    schedule 28.08.2015
comment
Конечно я могу. В любом случае это заставляет меня изменить каждый дочерний класс, а у меня их много. - person TsimoX; 28.08.2015
comment
если вы сделаете абстрактным суперкласс и абстрактный метод, IDE, по крайней мере, покажет все места, необходимые для реализации метода. - person Mikelis Kaneps; 28.08.2015
comment
это обходной путь. и это не решает основную проблему - у вас нет метода onEvent в дочернем классе (все общие события обрабатываются в базовом классе), поэтому предлагаемый код также получит исключение. - person TsimoX; 28.08.2015
comment
Это решает проблему, если вашему дочернему классу не нужен какой-либо onEvent, переопределите doIneedEventBus и верните false, если он нужен, не переопределяйте его и просто добавьте OnEvent с объектом, который вы хотите получить. Это решает проблему, другая единственная возможность - сделать попытку {} перехвата на EventBus.register - person Mikelis Kaneps; 28.08.2015
comment
ребенку это нужно. представьте обычное событие (например, закрыть все), и оно обрабатывается в базовом классе. и базовый класс в конструкторе (в OnCreate) делает EventBus.register(это). Но это будет тип дочернего класса. И у дочернего класса нет onEvent. - person TsimoX; 28.08.2015
comment
да, теперь я полностью понимаю вашу проблему. Вы можете поместить эту логику в действие и удалить ее из диалогового окна или дождаться завершения задачи. - person Mikelis Kaneps; 28.08.2015

Используйте библиотеку rxbus2, которая совместима с базовыми классами.

https://github.com/warrenth/RxBus2

person warrenTaehoon    schedule 17.07.2018