问题描述
所以在我的理解中,侦听器通常用于在特定地方发生某些事情时触发某个类。 (例如当我们点击按钮时我们想要做一些动作)。
另一方面,我看到一些地方使用回调来在不同的地方执行/排队一些代码。 (改造使用它来排队 API 调用)
这两个之间的主要区别是什么?
解决方法
简而言之,它们是相同的。
真的吗?
是的。但是存在一些“理论上的”(在某些情况下还有实际差异)。
概念
Listener 是 Android 中的一个词,它通常与 View ClickListener
或类似内容相关联。哪里有 addxxxListener(...)
等方法
通常在“针对此特定事件”的上下文中听到回调,我提供“回调”,当发生某些事情时,我将被回调。
实际上,它们通常只是传递的某些接口的实例。
以我有限的经验(只有大约 10 年的 Java/Android - 现在也是 Kotlin -),该术语可以互换使用。
当我期待某事发生时“给我回电”时,我通常会想到回调,而将侦听器视为我收听事件的地方,但正如您通过阅读本文所看到的那样......它们可能是相同的。 :)
经常提到一个人可以有多个侦听器,但只有一个回调(但没有强制执行此操作,而且我已经看到了所有用例,您可以想到使用任一术语的情况)“您可以添加多个回调”并不少见,即使有“多个”,那么它“必须是一个听众”。事实上,如果你走到Android的View
,方法是view.setOnClickListener { }
所以它是一个监听器,但你只能set
ONE。所以上面关于1个回调,N个监听器的规则从Android早期就已经被打破了。
但在某些情况下,约定更多地与方法名称相关,而不是类名称:
setXXXyyy(...)
允许您设置“一个”并且只有一个 yyy
侦听器/回调。
addXXXyyy(...)
允许您添加一个或多个(尽管并非总是如此,因此请阅读文档)yyy
侦听器/回调。
一个 add
通常(...但不总是)伴随着一个 removeXXXyyy(...)
,这意味着如果您保留/拥有对回调/侦听器的引用,您可以将其删除(并且不再是倾听或被召回)。
在 set
的情况下,通常希望 如果需要您调用 set...(null)
并传递该 null 以“删除”唯一的侦听器/回调。 (视图为你做这件事,你不需要调用它,但你可以)。
无论如何,不要引用我的话,但我认为它们是相同的。当您涉及其他语言/框架/工具时,这也会变得更加复杂,其中的界限更加模糊。
在许多情况下,您会看到使用了 callback
,但该方法包含单词“Listener”,反之亦然,所以不要太着迷。
如果可以,在可以的地方,不要使用它们,只使用协程:)
有关如何将两者用作同一事物的具体示例...
看看 Android View.setOnClickListener
方法:
/**
* Register a callback to be invoked when this view is clicked. If this view is not
* clickable,it becomes clickable.
*
* @param l The callback that will run
*
* @see #setClickable(boolean)
*/
public void setOnClickListener(@Nullable OnClickListener l) {
注意到一些奇怪的东西?
该方法名为 setOnClickListener
,但 Javadoc 说:“回调...”
对于一种事件,您可以有多个侦听器,但只有一个回调!
,他们是一样的!命名接口的两种方式。一般来说,Listener也是回调和VICE VERSA!
,回调是一个过程,您可以在其中将参数作为参数传递给另一个过程。接收参数的过程可以调用它,或者共享它以便系统中的其他一些过程可以调用它。
侦听器监视要触发的事件。例如,KeyListener 等待 KeyEvents,MessageListener 等待消息到达队列,等等。