侦听器和处理程序之间有什么区别?
我搜索了很多,但我找不到合适的解释。我在哪里使用监听器以及在哪里使用Android中的处理程序?
我也经历了以下链接:
Are event handler, event listener, and event registration all referring to the same thing?
我在哪里可以对这两个项目进行比较讨论?此外,任何人都可以告诉我有哪些不同类型的监听器和处理程序可用?
答案 0 :(得分:7)
基本区别在于事件处理程序让原始对象本身响应事件而执行某些操作,而事件侦听器让其他对象执行某些操作以响应事件发生在对象中。
例如:您的活动有一个按钮。如果您希望活动在有人触摸按钮时进行处理,则使用事件监听器(通过执行btn.setOnTouchListener(...))。但是,如果你想创建一个专门的按钮(例如看起来像狗和触摸时吠叫的按钮),你可以创建一个Button的子类并实现它的事件处理程序onTouchEvent(...)。在后一种情况下,按钮本身将处理其触摸事件。
答案 1 :(得分:2)
许多ActionScript类都有一些叫做事件的东西。当某个事件发生时,对象引发一个事件。例如,当某人将鼠标悬停在SWF中的按钮元件上时,会针对该特定Button实例引发Button.onRollOver事件。将鼠标移动到其他位置时,会针对同一实例引发Button.onRollOut事件。无论是否有人注意,都会发生这些事件。如果要实际执行某些操作以响应事件,则必须使用事件处理程序或事件侦听器对其进行管理。这两者之间的选择取决于对象 - 一些对象需要处理程序,一些侦听器 - 所以如果有疑问,请点击“ActionScript语言参考”。处理程序相对容易,但由于某种原因,听众似乎一开始就困扰着人们。
最受欢迎的事件可能属于Button和MovieClip类,它们碰巧共享许多相同的事物(电影剪辑可以是按钮,但不是相反)。要处理Button.onRelease事件,您只需将按钮符号拖到舞台上,然后通过“属性”检查器为其指定实例名称。在帧脚本中使用此名称可为事件分配函数。
myButton.onRelease = function() {
// do something
}
其他Button事件的工作方式与MovieClip事件和需要事件处理程序的所有事件的工作方式相同。
可以处理任意数量的事件。只需根据需要为每个事件分配一个函数。例如,响应翻转,释放和推出的按钮可能看起来像这样......
myButton.onRollOver = function() {
// do something
}
myButton.onRelease = function() {
// do something
}
myButton.onRollOut = function() {
// do something
}
管理事件侦听器需要更多步骤。使用通用Object实例完成侦听器。此对象充当至少两个其他对象之间的联络:引发事件的对象以及侦听事件的任何对象。我们来看一下MovieClipLoader示例。
var mcl:MovieClipLoader = new MovieClipLoader();
此时,我们已经声明了一个指向MovieClipLoader实例的变量mcl。现在我们将声明另一个指向Object实例的变量mclListener。 (听起来很有趣,我知道,但我们正在创建一个Object对象。)
var mclListener:Object = new Object();
这个通用对象现在将成为我们的联络人。此时,代码看起来与事件处理程序方法非常相似。
mclListener.onLoadInit = function() {
// do something
}
我本可以从MovieClipLoader类中选择任何事件,这没关系。这里需要注意的是,通用对象代表操作类实例处理事件。使用事件处理程序,操作类实例处理自己的事件。
现在我们有了监听器,现在已经代表我们的MovieClipLoader实例为其中一个事件分配了一个函数,我们只需要将监听器订阅到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
您也可以查看yahoo answer