首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Eventbus和Controldata

Eventbus和Controldata
EN

Stack Overflow用户
提问于 2015-10-08 21:23:19
回答 1查看 34关注 0票数 0

在我的应用程序中,我有一个分发来自外部的消息的eventbus。我想分发这些消息,包括一些Controldata。我想要使用的对象是这样的

代码语言:javascript
复制
class NewMessage<MESSAGE_TYPE> {
  MESSAGE_TYPE message;
  Controldata controldata;
}

因为我不能订阅泛型

代码语言:javascript
复制
NewMessage<MyMessage>

我创建了一个变通方法

代码语言:javascript
复制
class MyMessage extends Controldata {
}

我就可以订阅MyMessage了。另一种解决方案是为每个消息创建一个新的包装器类。

然而,我并不喜欢这两种解决方案。一种是因为MyMessage不是一个控件数据,另一种则意味着更多的开销。有什么办法干净利落地解决这个问题吗?

EN

回答 1

Stack Overflow用户

发布于 2015-10-08 21:46:38

选择不多。如果您希望能够订阅不同的消息类型,但这些类型不包括数据,那么在外部存储数据是可行的:

代码语言:javascript
复制
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提供的基础上编写自己的事件总线实现/扩展。不幸的是,它不是最灵活的总线。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33017141

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档