android - Otto(事件总线),将事件 fragment 发送到 fragment 但不接收

标签 android otto

MainActivity 有一个 NavigationDrawer,每个导航菜单都带有 Fragment 而不是新的 Activity。

有设置 fragment ,如果我更改导航菜单的顺序,它应该立即反射(reflect)到 NavigationDrawerFragment。

我在 SettingsFragment 中发布事件,但它没有出现在 NavigationDrawerFragment 中。

我做了一个AndroidBus extends Bus

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 将总线对象注入(inject)每个 fragment 我在 onActivityCreated 中注册 fragment ,并在 DestroyView 中注销它。

如果我发布的事件没有被传送,我会看到 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 中订阅了相同的事件,它就会收到该事件。

感谢您阅读本文,我希望有人能就此启发我。

最佳答案

我重新审视了这个问题,发现了我的愚蠢。原因是我使用了不同的 @Subscribe 注解。当您同时使用 OttoGuava 库时,可能会发生这种情况。因此,当您在 Android 应用中同时使用这两个库时,请注意这一点。

-import com.google.common.eventbus.Subscribe;
+import com.squareup.otto.Subscribe;

关于android - Otto(事件总线),将事件 fragment 发送到 fragment 但不接收,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25173145/

相关文章:

android - 如何知道 Otto 订户已注册

java - BusProvider 未返回@Subscribe

java - android studio findViewById-int 上的空指针异常

android - 如何检查 url 方案是 Http 还是 Https 并根据它创建 URLConnection

android - EventBus Producer 已经失效,不能再生产事件

java - 使用事件总线更新接口(interface)的缺点?

Android 事件总线替代方案

android - 解码未知类型代码

android - ApplicationInfo LoadLabel 增加我的服务的内存消耗(android)

java - 具有特殊字符时未解析 XML 文件节点属性