4

我在 EventBus 中使用粘性事件将我的“选定”对象传递给即将到来的活动。detail 活动允许用户“选择”另一个对象来获取新列表。我想再次将具有相同对象类的另一个粘性事件发布到另一个列表活动中,但据我了解,以前的粘性将被覆盖。请参阅底部的示例插图。

解决此问题的推荐方法是什么?我需要在 EventBus 中拥有具有相同类的 n 嵌套粘性事件。

我真的很喜欢粘性对象,它消除了我手动连接 Android Parcelable 接口的需要,只是为了通过该Intent机制将对象从一个活动活动发送到另一个活动。即使在获得一个完全工作的 EventBus 之后,我也不想被迫去实现 Parcelable,因为我不能嵌套粘性对象!

我想到的一种方法是Item在 Singleton 的 ArrayList 中维护我自己的对象堆栈,在深入潜水时推送(在 startActivity 之前)并在退出时弹出(但在哪里?onDestroy不使用),但这种方法似乎非常脆弱大部头书。我需要一个强大的机制 - 这是我的应用程序的主要导航支点。

  • 项目列表,用户选择一个Item. Item我们在 Intent 中使用 this 和 startActivity 发布一个带有详细视图类的粘性事件。
  • 用户浏览详细信息并询问相关项目的列表。我们开始另一个显示列表的活动。
  • 用户选择一个Item. 我们在 Intent 中使用第二个 Item和 startActivity 发布一个带有详细视图类的粘性事件。第二个Item覆盖第一个Item,当用户想要向上导航返回堆栈时,它不再可供读取,而是读取创建的最后一个粘性项目。
4

2 回答 2

1

通过查看源 https://github.com/greenrobot/EventBus/blob/master/EventBus/src/de/greenrobot/event/EventBus.java

第 52 行:

private final Map<Class<?>, Object> stickyEvents;

它使用类作为关键,所以我认为它不能完成,但我想到了一种解决方法。

设置数据时,您可以执行以下类似操作:

Map<String, List> data = new HashMap<>();
data.put("CLASS_A", objectA);
data.put("CLASS_B", objectB);
EventBus.getDefault().postSticky(scheduleData);

在您的接收端:

Map<String, List> data = EventBus.getDefault().getStickyEvent(HashMap.class);
objectA = data.get("CLASS_A");
objectB = data.get("CLASS_B");

它类似于意图,但至少代码更少,您将获得速度增益

于 2015-07-15T08:25:58.837 回答
0

我真的很喜欢有粘性的对象,它消除了我手动连接 Android Parcelable 接口的需要,只是为了通过 Intent 机制将对象从一个活动活动发送到另一个活动。即使在获得一个完全工作的 EventBus 之后,我也不想被迫去实现 Parcelable,因为我不能嵌套粘性对象!

EventBus 不打算用来代替 Intent 和 bundle。您应该使用 Intent 将信息从一个活动发送到另一个活动,并将相关参数放入 Bundle。如果您不自己编写所有 Parcelable 和 Serializable 代码(我完全可以理解),请查看https://projectlombok.org/它会震撼您的世界。您可以使用单个注释实现可打包和可序列化。

于 2016-02-26T17:39:23.240 回答