【问题标题】:Square Otto: @Subscribe is not called in fragment (Android)Square Otto:片段中未调用@Subscribe (Android)
【发布时间】:2015-11-03 12:09:10
【问题描述】:

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

问题:

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

【问题讨论】:

    标签: android android-fragments otto


    【解决方案1】:

    我意识到@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();
        }
    }
    

    有效!

    【讨论】:

      【解决方案2】:

      这是一项功能 - 请参阅文档中的 Subscribing

      注册只会在直接类类型上找到方法。 与 Guava 事件总线不同,Otto 不会遍历类层次结构并从带注释的基类或接口添加方法。这是一个明确的设计决策,旨在提高库的性能并保持您的代码简单明了。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-02
        • 1970-01-01
        相关资源
        最近更新 更多