MainActivity有一个NavigationDrawer,每个导航菜单都会带来Fragment而不是新的Activity。
有设置片段,如果我更改导航菜单的顺序,它应立即反映到NavigationDrawerFragment。
我在SettingsFragment中发布了事件,但它没有出现在NavigationDrawerFragment上。
我制作了AndroidBus扩展总线
public class AndroidBus extends Bus {
private final Handler mainThread = new Handler(Looper.getMainLooper());
public AndroidBus() {
super(ThreadEnforcer.ANY);
}
@Override
public void post(final Object event) {
if (BuildConfig.DEBUG) Ln.d("BUS: SYNC current thread="+Thread.currentThread().getName()+", post=" + event + " bus=" + this);
if (Looper.myLooper() == Looper.getMainLooper()) {
super.post(event);
} else {
mainThread.post(new Runnable() {
@Override
public void run() {
post(event);
}
});
}
}
@Override
public void register(Object object) {
super.register(object);
if (BuildConfig.DEBUG) Ln.d("BUS: SYNC current thread="+Thread.currentThread().getName()+", register=" + object + " bus=" + this);
}
@Override
public void unregister(Object object) {
super.unregister(object);
if (BuildConfig.DEBUG) Ln.d("BUS: SYNC current thread="+Thread.currentThread().getName()+", unregister=" + object + " bus=" + this);
}
}
我将Dagger的每个片段注入总线对象 我在onActivityCreated中注册片段,并在onDestroyView上取消注册。
如果我发布事件,则不会发送,我会看到DeadEvent日志。
08-07 11:00:27.203 3519-3519/com.test.app.debug D//AndroidBus.java:40﹕ main BUS: SYNC current thread=main, register=com.test.app.ui.MainActivity@536fa3b0 bus=[Bus "default"]
08-07 11:00:27.231 3519-3519/com.test.app.debug D//AndroidBus.java:40﹕ main BUS: SYNC current thread=main, register=NavigationDrawerFragment{536b79a4 #0 id=0x7f0a0072} bus=[Bus "default"]
08-07 11:00:27.247 3519-3519/com.test.app.debug D//MainActivity.java:127﹕ main SYNC: register: bus=[Bus "default"]
08-07 11:00:27.251 3519-3519/com.test.app.debug D//AndroidBus.java:40﹕ main BUS: SYNC current thread=main, register=SettingsFragment{536b7a2c #1 id=0x7f0a0071} bus=[Bus "default"]
08-07 11:00:31.415 3519-3519/com.test.app.debug D//AndroidBus.java:24﹕ main BUS: SYNC current thread=main, post=com.test.app.events.SettingsUpdatedEvent@536d1aa4 bus=[Bus "default"]
08-07 11:00:31.415 3519-3519/com.test.app.debug D//AndroidBus.java:24﹕ main BUS: SYNC current thread=main, post=com.squareup.otto.DeadEvent@5352027c bus=[Bus "default"]
我也在onCreate方法中注册了MainActivity,如果我在MainActivity中订阅相同的事件,它会收到事件。
感谢您阅读此内容,我希望有人能够启发我。
答案 0 :(得分:12)
我重新审视了这个问题,发现了我的愚蠢。原因是我使用了不同的@Subscribe
注释。当您同时使用Otto
和Guava
库时,可能会发生这种情况。因此,当您在Android应用中使用这两个库时,请注意这一点。
-import com.google.common.eventbus.Subscribe;
+import com.squareup.otto.Subscribe;
答案 1 :(得分:2)
我还想在会话中添加不能在@Subscribe
或interface
中声明super class
方法的对话,它们将不会被调用。
来自Otto
文档:
greenrobot的注册只会找到直接类类型的方法。与Guava事件总线不同,Otto不会遍历类层次结构,而是从基类或带注释的接口添加方法。这是一个明确的设计决策,可以提高库的性能,同时保持代码的简单和明确。
EventBus
支持此功能:
https://github.com/greenrobot/EventBus
答案 2 :(得分:1)
AFAIK,你的第二个片段没有收到事件消息,因为在调用第二个片段onActivityCreated
之前的第一个片段发布事件时创建的时间太晚了。
要解决此问题,您应该将事件对象保留在内存中,直到创建第二个片段并且可以接收此事件。我不确定Otto Bus
是否可以支持此功能。第二个选项是将事件对象保留在活动类中,第二个片段通过调用getActivity()
来获取它,但这样会破坏EventBus
的含义。
所以我推荐最后一个:使用GreenRobot EventBus,它支持比Otto
更多的功能,例如:在主线程和后台线程上发布,缓存事件(粘性事件)。您的问题将通过使用GreenRobot EventBus
的粘性事件来完成:
// Register stictky subscribers on onResume()
EventBus.getDefault().registerSticky(this);
// Unregister subscriber on onPause()
EventBus.getDefault().unregister(this);
// your subscribe event here
public void onEvent(AnyEventType event) {
}
// or subscribe event on main thread
public void onEventMainThread(AnyEventType event) {
}
// Post sticky events from the first fragment to the bus:
EventBus.getDefault().postSticky(AnyEventType);
更新:也许我对您的问题有误,there是同样的问题,并通过删除ThreadEnforcer.ANY
解决,您可以尝试。