回调和侦听器之间的Android区别 真的吗?概念

问题描述

所以在我的理解中,侦听器通常用于在特定地方发生某些事情时触发某个类。 (例如当我们点击按钮时我们想要做一些动作)。

另一方面,我看到一些地方使用回调来在不同的地方执行/排队一些代码。 (改造使用它来排队 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 等待消息到达队列,等等。