Square Otto: @Subscribe не вызывается во фрагменте (Android)

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

public abstract class MyBaseFrag extends Fragment {

    @Override
    public void onResume() {
        super.onResume();
        bus.register(this);
    }
    // unregister onPause...

    @Subscribe
    public void loadMapOnAnimationEnd(TransitionAnimationEndEvent event) {
        loadMap();
    }
}

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

public class MyFragment extends MyBaseFrag {
    // my code here..
}

Проблема:

Я отправляю событие, но метод никогда не вызывается.


person Juan Saravia    schedule 03.11.2015    source источник


Ответы (2)


Я понял, что @Subscribe не работает в абстрактных классах, но работает в конкретном классе.

Просто переместив @Subscribe method в MyFragment (не абстрактный класс), он просто работает:

public abstract class MyBaseFrag extends Fragment {

    @Override
    public void onResume() {
        super.onResume();
        bus.register(this);
    }
    // unregister onPause...
}


public class MyFragment extends MyBaseFrag {
    @Subscribe
    public void loadMapOnAnimationEnd(TransitionAnimationEndEvent event) {
        loadMap();
    }
}

Это работает!

person Juan Saravia    schedule 03.11.2015

Это функция — см. Подписка в документации:

При регистрации будут найдены только методы непосредственного типа класса. В отличие от шины событий Guava, Otto не будет проходить по иерархии классов и добавлять методы из базовых классов или интерфейсов, которые аннотированы. Это явное дизайнерское решение, направленное на повышение производительности библиотеки, а также на то, чтобы ваш код оставался простым и однозначным.

person tynn    schedule 03.11.2015