2012-09-21 111 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。它是線程安全的,類型安全的並支持不同類型的連接。

注意:我這個庫:)