我在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..
}
问题:
我发送了该事件,但从未调用该方法。
答案 0 :(得分:9)
我意识到@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();
}
}
有效!
答案 1 :(得分:1)
这是一项功能 - 请参阅文档中的Subscribing:
注册只能查找直接类类型的方法。与Guava事件总线不同,Otto不会遍历类层次结构,而是从基类或带注释的接口添加方法。这是一个明确的设计决策,可以提高库的性能,同时保持代码的简单和明确。