在我的应用程序中,我有一个分发来自外部的消息的eventbus。我想分发这些消息,包括一些Controldata。我想要使用的对象是这样的
class NewMessage<MESSAGE_TYPE> {
MESSAGE_TYPE message;
Controldata controldata;
}因为我不能订阅泛型
NewMessage<MyMessage>我创建了一个变通方法
class MyMessage extends Controldata {
}我就可以订阅MyMessage了。另一种解决方案是为每个消息创建一个新的包装器类。
然而,我并不喜欢这两种解决方案。一种是因为MyMessage不是一个控件数据,另一种则意味着更多的开销。有什么办法干净利落地解决这个问题吗?
发布于 2015-10-08 21:46:38
选择不多。如果您希望能够订阅不同的消息类型,但这些类型不包括数据,那么在外部存储数据是可行的:
private static Map<Object, ControlData> controlDataMap =
Collections.synchronizedMap(new WeakHashMap<>());
public void publish(Object message, ControlData data) {
controlDataMap.put(message, data);
bus.post(message);
}
@Subscribe void foo(SomeMessage msg) {
ControlData data = controlDataMap.get(msg);
// do things.
}映射的清理是自动的(只要事件被垃圾收集,一旦事件被处理),但在gc压力下可能不会很好地工作。
第二个限制:事件对象需要是唯一的,并且必须有一个合理的equals/hashcode实现。
除此之外,您可以在guava提供的基础上编写自己的事件总线实现/扩展。不幸的是,它不是最灵活的总线。
https://stackoverflow.com/questions/33017141
复制相似问题