9

リスナーとハンドラーの違いは何ですか?

たくさん検索しましたが、適切な説明が見つかりませんでした。Androidのリスナーはどこで使用し、ハンドラーはどこで使用しますか?

私も次のリンクを通過しました:

イベントハンドラー、イベントリスナー、およびイベント登録はすべて同じものを参照していますか?

これら2つの項目の比較ディスカッションはどこで入手できますか?また、利用可能なさまざまな種類のリスナーとハンドラーを教えてもらえますか?

4

2 に答える 2

8

基本的な違いは、イベントハンドラーでは、元のオブジェクト自体がイベントに応答して何かを実行できるのに対し、イベントリスナーでは、他のオブジェクトがそのオブジェクトで発生したイベントに応答して何かを実行できることです。

例:アクティビティにボタンがあります。誰かがボタンに触れたときにアクティビティを処理する場合は、イベントリスナーを使用します(btn.setOnTouchListener(...)を実行します)。ただし、特殊なボタン(たとえば、犬に触れて吠えるようなボタン)を作成する場合は、Buttonのサブクラスを作成し、そのイベントハンドラーonTouchEvent(...)を実装できます。この後者の場合、ボタン自体がタッチイベントを処理します。

于 2012-09-28T19:26:46.393 に答える
2

多くのActionScriptクラスは、イベントと呼ばれるものを備えています。イベントは、特定の発生が発生したときにオブジェクトによって発生します。たとえば、誰かがSWFのボタンシンボルにカーソルを合わせると、その特定のButtonインスタンスに対してButton.onRollOverイベントが発生します。マウスを別の場所に移動すると、同じインスタンスに対してButton.onRollOutイベントが発生します。これらのイベントは、誰かが気付くかどうかに関係なく行われます。イベントに応じて実際に何かをしたい場合は、イベントハンドラーまたはイベントリスナーで管理する必要があります。これら2つのどちらを選択するかは、オブジェクトによって決まります(一部のオブジェクトはハンドラーを想定し、一部のリスナーはリスナーを想定しています)。疑問がある場合は、古いActionScript言語リファレンスを参照してください。ハンドラーは比較的簡単ですが、何らかの理由で、リスナーは最初は人々を困惑させるようです。

イベントハンドラー

最も人気のあるイベントは、おそらくButtonクラスとMovieClipクラスに属しており、これらはたまたま同じものの多くを共有しています(ムービークリップはボタンにすることができますが、その逆はできません)。Button.onReleaseイベントを処理するには、ボタンシンボルをステージにドラッグし、プロパティインスペクターを介してインスタンス名を付けるだけです。フレームスクリプトでこの名前を使用して、イベントに関数を割り当てます。

myButton.onRelease = function() {
  // do something
}

他のButtonイベントは、MovieClipイベントや、イベントハンドラーを必要とするすべてのイベントと同じように機能します。

イベントはいくつでも処理できます。必要に応じて、各イベントに関数を割り当てるだけです。たとえば、ロールオーバー、リリース、ロールアウトに応答するボタンは次のようになります…</ p>

myButton.onRollOver = function() {
  // do something
}
myButton.onRelease = function() {
  // do something
}
myButton.onRollOut = function() {
  // do something
}

イベントリスナー

イベントリスナーの管理には、さらにいくつかの手順が必要です。リスナーは、汎用オブジェクトインスタンスを使用して実行されます。このオブジェクトは、イベントを発生させるオブジェクトと、イベントをリッスンするオブジェクトの少なくとも2つのオブジェクト間の連絡役として機能します。MovieClipLoaderの例を見てみましょう。

var mcl:MovieClipLoader = new MovieClipLoader();

この時点で、MovieClipLoaderのインスタンスを指す変数mclを宣言しました。次に、Objectのインスタンスを指す別の変数mclListenerを宣言します。(おかしなことに聞こえますが、私たちはObjectオブジェクトを作成しています。)

var mclListener:Object = new Object();

このジェネリックオブジェクトがリエゾンになります。この時点で、コードはイベントハンドラーのアプローチと非常によく似ています。

mclListener.onLoadInit = function() {
  // do something
}

MovieClipLoaderクラスから任意のイベントを選択できたはずですが、それは実際には問題ではありません。ここで注意すべきことは、ジェネリックオブジェクトが操作クラスインスタンスに代わってイベントを処理していることです。イベントハンドラを使用すると、運用クラスインスタンスは独自のイベントを処理します。

リスナーができたので、MovieClipLoaderインスタンスに代わって関数がそのイベントの1つに割り当てられたので、リスナーをmclにサブスクライブする必要があります。

mcl.addListener(mclListener);

終わり。オールインワンテイクを見てみましょう:

var mcl:MovieClipLoader = new MovieClipLoader();
var mclListener:Object = new Object();
mclListener.onLoadInit = function() {
  // do something
}
mcl.addListener(mclListener);

複数のイベントをリッスンするには、イベントハンドラーのアプローチに従ってください。

var mcl:MovieClipLoader = new MovieClipLoader();
var mclListener:Object = new Object();
mclListener.onLoadStart = function() {
  // do something
}
mclListener.onLoadProgress = function() {
  // do something
}
mclListener.onLoadInit = function() {
  // do something
}
mcl.addListener(mclListener);

参照:http ://www.quip.net/blog/2006/flash/event-handlers-listeners

このヤフーの答えをチェックすることもできます

于 2012-06-19T12:47:45.800 に答える