Могу ли я зарегистрировать автобус Otto как в базовом, так и в дочернем классе?

Я использую шину событий Otto в своем приложении для Android. Я прочитал документацию GitHub и различные вопросы, размещенные в Интернете о том, как работает обход иерархии:

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

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

public class BaseActivity extends Activity
    ...
    baseBus.register(this);

    @Subscribe public void baseAnswerAvailable(BaseAnswerAvailableEvent event) {
        // TODO: React to the event somehow in the base class
    }

public class MainActivity extends BaseActivity
    ...
    bus.register(this);

    @Subscribe public void answerAvailable(AnswerAvailableEvent event) {
        // TODO: React to the event somehow
    }

Будут ли вызываться оба метода baseAnswerAvailable и answerAvailable?


person Lou Morda    schedule 20.12.2015    source источник


Ответы (2)


ответ да на самом деле, и вот способ

https://github.com/square/otto/issues/26#issuecomment-33891598

public class ParentActivity extends Activity {
protected Object busEventListener;

@Override
protected void onCreate(final Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

     busEventListener = new Object() {
        @Subscribe
        public void onReceiveLoginEvent(final LoginEvent event) {
            ParentActivity.this.onReceiveLoginEvent(event);
        }
        @Subscribe
        public void onReceiveLogoutEvent(final LogoutEvent event) {
            ParentActivity.this.onReceiveLogoutEvent(event);
        }
    };

    BusProvider.getInstance().register(busEventListener);
}

//subclasses extend me. This can be abstract, if necessary.
protected void onReceiveLoginEvent(final LoginEvent event) {
    Log.d("Tag", "LoginEvent");
}

//subclasses extend me. This can be abstract, if necessary.
protected void onReceiveLogoutEvent(final LogoutEvent event) {
    Log.d("Tag", "LogoutEvent");
}

@Override
protected void onDestroy() {
    super.onDestroy();
    BusProvider.getInstance().unregister(busEventListener);
}
}
person Mustafa Güven    schedule 08.02.2017
comment
В итоге я получил простой класс для регистрации/отмены регистрации EventBus. Таким образом, его можно использовать в Activity/Fragment или Event Presenter. Спасибо! @мустафа-гювен - person Robert; 05.07.2019

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

@Produce
public BaseAnswerAvailableEvent baseAnswerAvailableEvent() {
    return new BaseAnswerAvailableEvent(message);
}

@Produce
public AnswerAvailableEvent answerAvailableEvent() {
    return new AnswerAvailableEvent(message);
}

Ответ — нет, вы не можете создавать и подписываться на отдельные события в базовом и дочернем классах. Я создал оба события, и только AnswerAvailableEvent в дочернем классе получил событие.

person Lou Morda    schedule 28.12.2015