Square Otto:@Subscribe未在片段中调用(Android)

时间:2015-11-03 12:09:10

标签: android android-fragments otto

我在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..
}

问题:

我发送了该事件,但从未调用该方法。

2 个答案:

答案 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不会遍历类层次结构,而是从基类或带注释的接口添加方法。这是一个明确的设计决策,可以提高库的性能,同时保持代码的简单和明确。