Otto如何在Fragment和Activity之间通信

3

我最近几天一直在尝试使用Otto,发现它非常好用。但是我遇到了一个问题,我正在尝试从一个片段(Fragment)向活动(Activity)通信。为了简单起见,我只有一个活动来容纳这个片段,在这个片段中我有一个按钮,它只是简单地发布一个事件。

@Inject Bus bus;
...
...
bus.post(new ReadStatusEvent("23"));

在 Activity 中,我有一个“Subscribe”方法。
@Subscribe
public void onReadStatusEvent(ReadStatusEvent event){
    Timber.i("sub:"+event.getReadStatusID());
}

这里是事件

public class ReadStatusEvent {
  private final String readStatusID;

  public ReadStatusEvent(String readStatusID) { this.readStatusID = readStatusID; }

  public String getReadStatusID() { return readStatusID; }
}

我正在使用Dagger,所以我的Otto Bus是一个单例,由SimpleModule文件注入。

@Provides @Singleton
Bus provideBus() {
    return new Bus(ThreadEnforcer.ANY);
}

我已经整天在做这个,但不知何故Subscribe方法从未被调用。

编辑: 我刚刚尝试使用Android Studio的Otto插件,每当我点击@Subscribe或bus.post(..)时,它会继续搜索但找不到任何东西(至今没有发现任何用法)。我想我在某个地方做错了什么。


插件目前出了问题,所以不是你的错。 - Krylez
2个回答

11

你关于Otto插件的提示让我想到了你的导入。

你确定你正在使用的是 "com.squareup.otto.Subscribe",而不是 "com.google.common.eventbus.Subscribe" 或其他任何包吗?


糟糕!你说得对,我从没注意到这个导入问题,只是改了一下,现在它完美地运行了。非常感谢! - Raza

0
要接收事件,一个类实例需要在总线上注册。你是否正在注册持有你的订阅者/生产者的对象?
bus.register(this); // Example

是的,我把它放在Activity和Fragment的onStart()方法中。 - Raza

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接