Greenbot Eventbus 3.0:onEvent、onEventMainThread、onEventBackgroundThread 和 onEventAsync 有什么区别?
Greenbot Eventbus 3.0: What is the difference between onEvent, onEventMainThread, onEventBackgroundThread and onEventAsync?
我对 onEvent
、onEventMainThread
、onEventBackgroundThread
和 onEventAsync
在 Greenrobot's EventBus 3.0
中的用法有点困惑
根据我在 documentation 中看到的内容:
onEvent
与 ThreadMode.POSTING
一起使用(默认)
onEventMainThread
与 ThreadMode.MAIN
一起使用
onEventBackgroundThread
与 ThreadMode.BackgroundThread
一起使用
onEventAsync
与 ThreadMode.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 吗?
我找到了答案,与 EventBus 2 不同,方法名称并不重要,因为在 EventBus 3 上使用注释有利于反射,因此以下内容将起作用:
@Subscribe(threadMode = ThreadMode.MAIN)
public void someMethodName(MyEvent event) {
// some UI manipulation
}
我把这个问题留在这里是为了给可能有同样问题的人腾出时间。
@Subscribe
是向EventBus注册方法的注解,以前是通过反射完成的,所以必须在a中命名方法特定方式(onEvent
、onEventMainThread
等)。这有两个缺点:
- 反射在 Java 和
中相当慢
- 命名约定对新用户来说不是很直观。
这两个缺点都已通过更新消除,因此现在您可以随意命名您的方法,并在注释参数中指明您希望事件在哪个线程中 运行。
我对 onEvent
、onEventMainThread
、onEventBackgroundThread
和 onEventAsync
在 Greenrobot's EventBus 3.0
根据我在 documentation 中看到的内容:
onEvent
与ThreadMode.POSTING
一起使用(默认)onEventMainThread
与ThreadMode.MAIN
一起使用
onEventBackgroundThread
与ThreadMode.BackgroundThread
一起使用
onEventAsync
与ThreadMode.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 吗?
我找到了答案,与 EventBus 2 不同,方法名称并不重要,因为在 EventBus 3 上使用注释有利于反射,因此以下内容将起作用:
@Subscribe(threadMode = ThreadMode.MAIN)
public void someMethodName(MyEvent event) {
// some UI manipulation
}
我把这个问题留在这里是为了给可能有同样问题的人腾出时间。
@Subscribe
是向EventBus注册方法的注解,以前是通过反射完成的,所以必须在a中命名方法特定方式(onEvent
、onEventMainThread
等)。这有两个缺点:
- 反射在 Java 和 中相当慢
- 命名约定对新用户来说不是很直观。
这两个缺点都已通过更新消除,因此现在您可以随意命名您的方法,并在注释参数中指明您希望事件在哪个线程中 运行。