【问题标题】:Greenbot Eventbus 3.0: What is the difference between onEvent, onEventMainThread, onEventBackgroundThread and onEventAsync?Greenbot Eventbus 3.0:onEvent、onEventMainThread、onEventBackgroundThread和onEventAsync有什么区别?
【发布时间】:2016-02-14 03:09:06
【问题描述】:

我对@9​​87654321@中onEventonEventMainThreadonEventBackgroundThreadonEventAsync的用法有点困惑

根据我在documentation 中看到的内容:

  • onEventThreadMode.POSTING 一起使用(默认)
  • onEventMainThreadThreadMode.MAIN 一起使用
  • onEventBackgroundThreadThreadMode.BackgroundThread 一起使用
  • onEventAsyncThreadMode.ASYNC 一起使用

但如果事件是从后台线程发布的:

@Subscribe(threadMode = ThreadMode.MAIN)
public void onEventMainThread(MyEvent event) {
    // some UI manipulation
}

与以下行为完全相同:

@Subscribe(threadMode = ThreadMode.MAIN)
public void onEvent(MyEvent event) {
    // some UI manipulation
}

还有:

@Subscribe
public void onEventMainThread(MyEvent event) {
    // some UI manipulation
}

抛出CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.,因为该线程与发布线程(我的测试中的后台线程)相同。

从3.0版开始,@Subscribe注解是必需的,所以我不明白在这种情况下我应该使用onEvent以外的方法。是否保留它们以方便从 EventBus 2 升级到 3?

【问题讨论】:

    标签: java android event-bus greenrobot-eventbus greenrobot-eventbus-3.0


    【解决方案1】:

    我找到了答案,与 EventBus 2 不同,方法名称并不重要,因为在 EventBus 3 上使用了有利于反射的注释,因此以下方法将起作用:

    @Subscribe(threadMode = ThreadMode.MAIN)
    public void someMethodName(MyEvent event) {
        // some UI manipulation
    }
    

    我把这个问题留在这里是为了给可能有同样问题的人腾出时间。

    【讨论】:

    • 是的。已完全移至注释,方法名称不再重要。很高兴你找到了答案。
    【解决方案2】:

    @Subscribe 是向 EventBus 注册方法的注解,过去这是通过反射完成的,这就是为什么您必须以特定方式命名方法(onEvent, onEventMainThread 等)。这有两个缺点:

    1. Java 中的反射很慢,而且
    2. 命名约定对于新用户来说并不是很直观。

    更新消除了这两个缺点,因此现在您可以随意命名您的方法,并在注释参数中指明您希望事件在哪个线程中运行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-31
      • 2015-12-02
      • 1970-01-01
      • 2021-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多