Java - 信号/插槽机制

时间:2012-09-21 20:01:48

标签: java signals-slots

对于Java生态系统相对较新的人来说,是否有一种相当轻量级的方法来执行Qt和Django等框架对其信令/接收器系统的处理,其中组件可以说“我正在做某事”,以及其他组件可以以一种相当松散耦合的方式处理它吗?

如果这个问题没有通过“单一客观答案”测试,我会提前道歉。

编辑:要添加更多上下文,这与Web服务的数据库驱动的应用程序层相关。某些资源在持久化时,还需要保存包含额外上下文信息的审计记录。在Django中,我通过信令机制来做这件事,或者使用几个现有的库之一。对于Scala程序,我使用回调函数制作了自己的hacky东西,但是使用第一类函数更容易。我毫不怀疑像Swing这样的框架为这种事情提供了设施,但是我(可能是不合理地)将这种依赖添加到目前相当普通的应用程序(不是说Django本身不是一个对香草Python的巨大依赖!)

4 个答案:

答案 0 :(得分:4)

在Java中,至少在UI方面,这通常使用listener approach来完成:您注册一个在特定事件发生时调用的侦听器方法。它可能比Qt信号/插槽机制稍微松散耦合......你可能考虑的另一种方法是java message service,它专门用于客户端/服务器系统中基于松散耦合的通信。 Java EE标准。

答案 1 :(得分:4)

如果您正在寻找提供类似于Qt的信号/插槽机制的Java库,那么您应该查看sig4j。它是线程安全的,类型安全的,并支持不同类型的连接。

注意:我是这个图书馆的作者:)

答案 2 :(得分:2)

我同意有关事件驱动编程的其他意见/答案。

您可能对http://eventbus.org感兴趣。这允许您全局广播/接收事件,而无需在每个事件生成器上显式注册侦听器。

答案 3 :(得分:1)

在您想要接收信号的班级中,您可以定义Broadcastreceiver:

private BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        updateUI();
    }
};

@Override
public void onPause() {
    super.onPause();
    getActivity().unregisterReceiver(broadcastReceiver);
}

@Override
public void onResume() {
    super.onResume();
    getActivity().registerReceiver(broadcastReceiver, new IntentFilter(Constants.ACTION_UPDATE_PROFILE_UI)); // the constant is to identify the type of signal, it can be any string you want
}

然后在您要发送信号的班级中,只需执行以下操作:

Intent signalIntent = new Intent(Constants.ACTION_UPDATE_PROFILE_UI);

将想要的数据类型添加到意图中,然后将其广播为:

sendBroadcast(signalIntent);

您可以在此处找到示例应用程序:

https://github.com/nickfox/Update-Android-UI-from-a-Service