【问题标题】:Eventbus onMessageEvent not getting calledEventbus onMessageEvent 没有被调用
【发布时间】:2018-04-28 09:05:48
【问题描述】:

我已经在我的项目中实现了 EventBus,但我没有得到我所有的事件

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button button = findViewById(R.id.btn);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                EventBus.getDefault().post(new MessageEvent());
                EventBus.getDefault().post(new MessageEvent2());
            }
        });
    }
    @Subscribe(threadMode = ThreadMode.MAIN)
    public void onMessageEvent(MessageEvent event)
    {
        Toast.makeText(this, "MainActivity called", Toast.LENGTH_SHORT).show();
    };

    @Override
    public void onStart() {
        super.onStart();
        EventBus.getDefault().register(this);
    }

    @Override
    public void onStop() {
        super.onStop();
        EventBus.getDefault().unregister(this);
    }
}

在这里,我在 onClick(); 中创建了 2 个事件; 这是我的另一个活动,我有另一个 @Subscribe

public class AnotherActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_another);
    }

    @Subscribe(threadMode = ThreadMode.MAIN)
    public void onMessageEvent(MessageEvent2 event2)
    {
        Toast.makeText(this, "AnotherActivity called", Toast.LENGTH_SHORT).show();//Not getting called
    };

    @Override
    public void onStart() {
        super.onStart();
        EventBus.getDefault().register(this);
    }

    @Override
    public void onStop() {
        super.onStop();
        EventBus.getDefault().unregister(this);
    }
}

我不知道为什么我的第二个 toast 没有被调用,我做的每件事都是正确的。

我怀疑AnotherActivity 还没有创建,所以我的事件没有被调用,那么EventBus 的用途是什么?

【问题讨论】:

    标签: android callback greenrobot-eventbus greenrobot-eventbus-3.0


    【解决方案1】:

    我怀疑 AnotherActivity 尚未创建,所以我的事件 不叫是这样的

    是的,如果事件发生在过去并且组件(活动)未激活/未创建,则不会收到该事件。

    那么EventBus有什么用呢?

    您可以使用Sticky Event 在新创建的活动中收听过去的事件

    所以使用postSticky

    EventBus.getDefault().postSticky(new MessageEvent2());
    

    并在subscribe注解中添加sticky = true

    @Subscribe(sticky = true, threadMode = ThreadMode.MAIN)
    public void onMessageEvent(MessageEvent2 event2){
        Toast.makeText(this, "AnotherActivity called", Toast.LENGTH_SHORT).show();//Not getting called
    };
    

    或者您可以手动接收它们

    MessageEvent2 msg2 = EventBus.getDefault().getStickyEvent(MessageEvent2.class);
    // you can also remove it using
    // EventBus.getDefault().removeStickyEvent(msg2);
    

    或将其从历史记录中删除

    MessageEvent2 msg2 = EventBus.getDefault().removeStickyEvent(MessageEvent2.class);
    if(msg2!=null){//do something}
    

    【讨论】:

    • 我得到异常为> 原因:org.greenrobot.eventbus.EventBusException:当我在我的实际项目中使用时,订阅者类 akki.amoledlauncher.rv.Main2Activity 已经注册到事件类 akki.amoledlauncher.ListenerEvent
    • 什么时候出现异常?请解释一下
    • 嘿,非常感谢,我错过了取消注册 eventBus onStop 所以它在创建活动时尝试再次订阅
    • 很高兴能帮上忙,编码愉快
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-15
    • 1970-01-01
    • 1970-01-01
    • 2018-11-25
    • 2019-03-31
    • 2012-12-16
    相关资源
    最近更新 更多