7

我昨天开始使用 OTTO by Square,到目前为止我有一个好的开始。

当您的 Fragment 已经托管在 FragmentActivity 中并且您只需要在该 FragmentActivity 托管的 Fragment 之间进行通信时,Otto 开箱即用的效果很好。

当已经托管时,您的 #onResume() Methode 会被调用,并且 Fragment 可以在 Eventbus 上注册自己:

@Override
public void onResume()
{
    super.onResume();
    BusProvider.getInstance().register(this);
}

我的问题:

嵌入在额外Activity 中的 Fragment 应该通过 Eventbus 接收事件,如下所示:

public AnotherFragmentHostedInSomeActivity extends Fragment
{
         .....

    @Subscribe
    public void onSomethingHappend(final Event event)
    {

          final SomeObject deliveredObject = event.getSomeObject();

但是,当您想在那里调用另一个托管类似以下代码的片段的活动时,看起来事情仍然很复杂:

public class SomeFragmentSendingDataToAnotherFragment extends Fragment
{
            ...
    private void sendData()
    {
            final Intent intent = new Intent(applicationContext, SomeActivity.class);
            applicationContext.startActivity(intent);                                 
            BusProvider.getInstance().post(new Event(someObject));

正如您可能已经看到的那样,这段代码很狡猾。由于生命周期,启动 Activity 然后将数据发送到该 Activity 托管的 Fragment 无法正常工作。因此,活动被创建,片段也被创建。有时会调用 onResume Methode,以便 Fragment 可以使用 @Subscribe 注册自己。但这一切都发生事件已经通过 EventBus 发布之后。因此,感兴趣的片段永远不会被 EventBus 调用。

任何人都知道如何以聪明的方式做到这一点?

那里有一些额外的信息:昨天我和 OTTO 玩得很开心。只有当我需要将数据发送到另一个活动时,问题才会出现在我的项目中,在我的情况下,这种情况总是发生在应用程序在智能手机上运行时,而不是平板电脑上。在我通过 Intent 和 Parcelable 发送所有数据之前。Otto 会减少编写 Parcleable Objects 的需要,所以我想这样做。

感谢您的回答

4

3 回答 3

16

当第二个 Activity 开始时,你原来的 Activity 已经消失了。正如其他人所指出的,如果您想将数据从 Activity 传递到 Activity,使用 Intents 可能是最好的途径。

如果你真的想要一个事件总线,你需要一个即使在第一个活动消失后仍然保持活动状态的对象。在 Android 中,这与应用程序上下文相关,或者如果使用 Dagger 或 Guice,则为 @Singleton。

这个单例是使用 Otto 的 @Produce 注释的地方。当第二个 Activity 订阅总线时,它将接收来自该 @Produce 方法的任何数据。

于 2012-11-08T17:03:24.493 回答
1

您可以查看 Otto github issue上发布的 Jake Wharton 的答案。您可以使用@Producer。

当您发出 HTTP 请求并将响应缓存在某处(例如,员工列表)时。大多数人会启动一个请求,并在某个回调收到响应时让他们的活动直接执行。当回调发生在 onPause 之后和 onResume 之前,就会出现问题,就像设备旋转时一样。相反,您可以做的是,当 HTTP 调用在总线上返回时发布一个事件,以便任何收听的人接收它并将其发送到缓存。然后,如果任何新订阅者对响应感兴趣,您可以让生产者与缓存对话以生成 HTTP 调用的结果。这样,当您暂停活动(并取消注册)并返回调用时,一旦您恢复(并重新注册)您的生产者将被调用并通知活动。

于 2015-12-04T11:40:52.663 回答
0

您是否尝试过使用 @Produce 注释?当第二个 Activity 中的 Fragment 在总线上注册自身时,任何具有相应 @Produce 方法的 @Subscribe 方法都将运行。

于 2012-11-07T13:45:11.333 回答