2012-09-21 9 views
5

Für jemanden, der relativ neu im Java-Ökosystem ist, gibt es einen ziemlich leichten Weg zu tun, was Frameworks wie Qt und Django mit ihrem Signal-/Empfängersystem tun, wo Komponenten sagen können: "Ich mache etwas ", und andere Komponenten können das ziemlich lose miteinander umgehen?Java - Signal/Slots-Mechanismus

Ich entschuldige mich im Voraus, wenn diese Frage den "objektiven Einzelantwort" Test nicht besteht.

Bearbeiten: Um ein wenig mehr Kontext hinzuzufügen, bezieht sich dies auf eine datenbankgesteuerte Anwendungsschicht für einen Webdienst. Bestimmte Ressourcen müssen, wenn sie beibehalten werden, auch einen Prüfdatensatz speichern, der zusätzliche Kontextinformationen enthält. In Django würde ich das über den Signalmechanismus tun oder eine von mehreren existierenden Bibliotheken benutzen, die genau das tun. Für ein Scala-Programm habe ich meine eigene Hacky-Sache mit Callback-Funktionen gemacht, aber es ist einfacher mit erstklassigen Funktionen. Ich habe keinen Zweifel daran, dass Frameworks wie Swing Möglichkeiten für diese Art von Dingen bieten, aber ich bin (vielleicht ungerechtfertigt) bereit, eine solche Abhängigkeit zu einer derzeit ziemlich vanilligen Anwendung hinzuzufügen (nicht, dass Django nicht selbst eine ist) massive Abhängigkeit von Vanille Python!)

+0

Sind Sie sprechen [ereignisgesteuerte Modelle] (http://en.wikibooks.org/wiki/Java_Programming/Event_Handling)? – jefflunt

+3

Auf einer mittleren bis großen Komponentenebene, wo Sie Schnittstellen haben, die 2 oder mehr Methoden implementieren, denke ich, dass Dependency Injection den Kampf um die Kopplung von Komponenten gewonnen hat. Auf der kleinen Ebene (wie das Bereitstellen einer Aktion für eine GUI-Schaltfläche) ist das Listener-Muster König. –

+0

@normalocity: Ja, aber nicht direkt mit GUI-Programmierung verbunden. – Mikesname

Antwort

3

In Java, zumindest auf der UI-Seite, wird dies normalerweise mit der listener approach getan: Sie registrieren eine Listener-Methode, die aufgerufen wird, wenn bestimmte Ereignisse auftreten. Es ist vielleicht ein wenig weniger lose gekoppelt als der Qt-Signal/Slot-Mechanismus ... Ein anderer Ansatz, den Sie in Betracht ziehen könnten, ist das Java message service, das speziell für lose gekoppelte Kommunikation in Client/Server-Systemen auf Basis des Java EE-Standards entwickelt wurde.

+1

Wahr.Aber manchmal sogar mit anonymen Klassen ist immer noch zu viel Struktur. QtJambi (das in Java implementierte Qt-Framework) verwendet jedoch Reflection, um Signal-Slots bereitzustellen, und IMHO führt zu einer geringeren Zeilenzahl und einem klareren Code, verliert jedoch die Typsicherheit. –

2

Ich stimme den anderen Kommentaren/Antworten in Bezug auf ereignisgesteuertes Programmieren zu.

Das könnte Sie interessieren: http://eventbus.org. Auf diese Weise können Sie Ereignisse global senden/empfangen, ohne explizit Listener bei jedem Ereignisproduzenten registrieren zu müssen.

0

In der Klasse, in der Sie das Signal empfangen möchten, können Sie eine Broadcastreceiver definieren:

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 
} 

Dann in der Klasse, in der Sie das Signal senden möchten, gehen Sie einfach:

Intent signalIntent = new Intent(Constants.ACTION_UPDATE_PROFILE_UI); 

Fügen Sie den gewünschten Datentyp hinzu und senden Sie ihn dann wie folgt aus:

sendBroadcast(signalIntent); 

Sie können ca n eine Beispielanwendung finden Sie hier:

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

3

Wenn Sie eine Java-Bibliothek suchen, die ein Signal/Slot-Mechanismus ähnlich wie Qt bietet, dann sollten Sie einen Blick auf sig4j haben. Es ist threadsicher, typsicher und unterstützt verschiedene Arten von Verbindungen.

Hinweis: Ich bin der Autor dieser Bibliothek :)