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

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

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

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

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?

2 ответа

Ответ на самом деле да, и вот путь

https://github.com/square/otto/issues/26

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);
}
}

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

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

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

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

Другие вопросы по тегам