【问题标题】:Greenrobot EventBus event not received未收到 Greenrobot EventBus 事件
【发布时间】:2020-10-11 06:00:32
【问题描述】:

我正在使用 Greenrobot EventBus 将事件从一个活动传递到另一个活动。

流程是这样的: Activity1 启动 -> 扫描条形码 -> Activity2 启动 -> 接受或拒绝响应并向 Activity1 发送事件。

所以 Activity2 通过执行以下操作向 Activity1 发送一个新事件:

@Override
public void onCreate(){
  EventBus.getDefault().register(this);
  // other initialization code
  EventBus.getDefault().post(new MyEvent());
}

在 Activity1 中,我注册了事件总线,并且我还拥有用于接收事件的公共 onEvent(MyEvent myEvent) 方法。

问题是onEvent没有被触发。我查看了事件总线对象上可能存在问题(例如不同的实例或 Activity 1 和 2 中的某些东西),但它是同一个实例。

我不知道似乎是什么问题。如果有人可以看看并告诉我我做错了什么,我将不胜感激。

谢谢!

【问题讨论】:

标签: android greenrobot-eventbus


【解决方案1】:

在这种情况下,您可能需要使用粘性事件。 Activity1 启动 Activity2 后进入后台,无法再接收任何事件。

把它放在你的 Activity1 中,而不是 EventBus.getDefault().register(Object Event)

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

替换

EventBus.getDefault().post(new MyEvent());

在 Activity2 中与

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

Here is a link to the documentation explaining it

【讨论】:

    【解决方案2】:

    您的 Activity1 EventBus 注销是什么样子的?

    因为我正在这样做,所以我遇到了同样的问题:

    Activity1.java
    
    @Override
    protected void onStop() {
         super.onStop()
         EventBus.getDefault().unregister(this);
    }
    

    这样做的问题是,当您启动 Activity2 时,onStop 会被调用,因此会删除对该事件的订阅。我能够通过将取消注册移动到 onDestroy 来解决这个问题:

    Activity1.java
    
    @Override
    protected void onDestroy() {
        super.onDestroy();
        EventBus.getDefault().unregister(this);
    }
    

    【讨论】:

      【解决方案3】:

      类测试

      public class TestEventBus {
      
      private String label;
      
      public String getLabel() {
          return label;
      }
      
      public void setLabel(String label) {
          this.label = label;
      }
      }
      

      活动 A

      TestEventBus t = new TestEventBus();
      t.setLabel("oi");
      EventBus.getDefault().post( t );
      

      活动 B

      @Subscribe(sticky = true, threadMode = ThreadMode.MAIN)
      public void onMessageEvent(TestEventBus test) {
      
      Toast.makeText(this, "label "+test.getLabel(), 
      Toast.LENGTH_SHORT).show();
      
      };
      
      @Override
      public void onStart() {
        super.onStart();
        EventBus.getDefault().register(this);
      }
      
      @Override
      public void onStop() {
        super.onStop();
        EventBus.getDefault().unregister(this);
      
       }
      

      【讨论】:

        【解决方案4】:

        在新版本中接收粘性事件设置sticky标志true:

        @Subscribe(threadMode = ThreadMode.MAIN, sticky = true)
        fun onNewEvent(event: MessageEvent) {
            //...
        }
        

        【讨论】:

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