2012-09-21 119 views
5

对于Java生态系统相对较新的人来说,是否有一种相当轻量级的方式来执行诸如Qt和Django之类的框架,并使用它们的信令/接收器系统,组件可以说“我在做东西“,其他组件可以以相当松散的方式处理它?Java - 信号/插槽机制

如果此问题未能通过“单一客观答案”测试,我很抱歉。

编辑:要添加更多的上下文,这与Web服务的数据库驱动应用程序层相关。某些资源在持续存在时还需要保存包含额外上下文信息的审计记录。在Django中,我会通过信号机制来做到这一点,或者使用几个现有的库中的一个来做这件事。对于一个Scala程序,我使用回调函数创建了自己的黑客事物,但使用第一类函数更容易。我毫不怀疑像Swing这样的框架为这类事物提供了便利,但是我(可能是不合理的)会添加这样一个依赖于目前相当普通的应用程序的事实(并非Django本身并不是大量依赖于香草Python!)

+0

你说的是[事件驱动模型]的作者(http://en.wikibooks.org/wiki/Java_Programming/Event_Handling)? – jefflunt

+3

在一个中等到很大的组件级别,你有接口实现2个或更多的方法,我认为依赖注入赢得了如何耦合组件的战斗。在小的层次上(如向GUI按钮提供动作),监听器模式是王道。 –

+0

@normalocity:是的,但与GUI编程没有直接关系。 – Mikesname

回答

3

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

+1

是的。但有时甚至使用匿名类仍然是太多的结构。然而,QtJambi(用Java实现的Qt框架)利用Reflection以较低的行数和更清晰的代码提供信号插槽和恕我直言结果,但是却失去了类型安全性。 –

2

我同意关于事件驱动编程的其他评论/回答。

您可能会感兴趣http://eventbus.org。这使您可以全局广播/接收事件,而无需在每个事件制作者上明确注册侦听器。

0

在要接收信号的类,你可以定义一个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); 

You ca在这里,n找到一个示例应用程序:

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

3

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

注意:我这个库:)