2012-09-21 10 views
5

Javaエコシステムの比較的新しい方のために、QtやDjangoのようなフレームワークをシグナリング/レシーバシステムで行うためのかなり軽量な方法があります。他のコンポーネントはかなり緩やかに結合された方法でそれを処理できますか?Javaシグナル/スロット機構

この質問が「単一目的の回答」テストに合格しなかった場合は、事前にお詫びします。

編集:もう少しコンテキストを追加するには、これはWebサービスのデータベース駆動型アプリケーション層に関連しています。特定のリソースは、永続化されると、追加のコンテキスト情報を含む監査レコードも保存する必要があります。 Djangoでは、シグナリングの仕組みを使ってこれをやっています。それを行う既存のライブラリをいくつか使用しています。 Scalaプログラムでは、コールバック関数を使用して私自身のハッキーなことを作りましたが、ファーストクラスの関数では簡単です。私はSwingのようなフレームワークがこの種の機能を提供していることは間違いないが、現在のところかなりバニラのアプリケーションにそのような依存性を追加することは(おそらく不当に)

+0

あなたは(http://en.wikibooks.org/wiki/Java_Programming/Event_Handling)[イベント駆動型モデル]について話していますか? – jefflunt

+3

中規模から巨大なコンポーネントレベルでは、2つ以上のメソッドを実装しているインターフェイスがあります。依存関係インジェクションは、コンポーネントを結合する方法の戦いで勝ったと思います。小さなレベル(GUIボタンにアクションを提供するようなもの)では、リスナーパターンはキングです。 –

+0

@normalocity:yesですが、GUIプログラミングには直接関係しません。 – Mikesname

答えて

3

Javaでは、少なくともUI側では、これは通常listener approachで行われます。特定のイベントが発生したときに呼び出されるリスナーメソッドを登録します。しかし、Qtシグナル/スロットのメカニズムより少し緩く結合されているかもしれません... JavaのEE標準に基づくクライアント/サーバシステムの疎結合通信のために特別に設計されたJavaのmessage serviceが考えられます。

+1

真。しかし、時には匿名クラスを使用することさえも、あまりにも多くの構造です。しかしQtJambi(Javaで実装されたQtフレームワーク)はReflectionを使用してシグナルスロットとIMHOの結果をより少ない行数とより明確なコードで提供しますが、型の安全性は失われます。 –

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); 

nは、ここでサンプルアプリケーションを見つける:あなたは、あなたがsig4jを見ている必要がありQtのと同様の信号/スロットメカニズムを提供するJavaライブラリを探しているなら

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

3

。スレッドセーフで、型保証され、さまざまなタイプの接続をサポートします。

:私はこのライブラリの作者だ:)

関連する問題