Могу ли я зарегистрировать автобус 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 в дочернем классе получило событие.