Java 事件监听器返回值

标签 java

我正在使用 Java8。我有一个监听器,它在使用 customToken 完成时调用 onSuccess

@Override
public String getCustomToken(Person person) {
    FirebaseAuth.getInstance().createCustomToken(person.getUid()).addOnSuccessListener(new OnSuccessListener<String>() {
        @Override
        public void onSuccess(String customToken) {
            // I would like to return the customToken
        }
    });
    return null;
}

问题

如何让此方法返回字符串 customToken

最佳答案

您的问题很有趣,但不幸的是,已接受的答案为您提供了错误的方法。

你的问题是 API 的问题。您正在尝试以并非设计用于使用的方式使用回调。根据定义,回调应该提供一种异步执行某些操作的方法。它更像是当某事发生时(将来)该做什么的规范。使 getCustomToken() 等同步方法返回的内容是 onSuccess() 等固有异步操作的结果,这意味着根本上断开连接。

在处理回调时,了解延续的重要性至关重要:在发生某些感兴趣的事件时采取行动。请注意,这些事件甚至可能不会发生。但是您在代码中指定了当这些事件发生时要采取的行动。因此,延续风格是程序风格的转变。

增加数据流复杂性的是匿名内部类的语法。您可能会想“哦,为什么我不能从这里返回 onSuccess() 返回的内容?毕竟,代码就在这里。”但是想象一下 Java 没有内部类(您可能知道,(匿名)内部类可以很容易地被不是内部类的类替换)。您需要执行以下操作:

OnSuccessListener listener = new SomeImplementation();
FirebaseAuth.getInstance().createCustomToken(listener);

现在,返回数据 (String) 的代码消失了。您甚至可以从视觉上推断,在这种情况下,您的方法无法返回字符串——它根本不存在!

因此,我鼓励您考虑一下如果以及何时(将来)在您传入的 OnSuccessListener 实例上调用 onSuccess() 应该发生什么。在换言之,如果您真的想在您的 API 中提供getCustomToken() 方法(返回一个标记字符串,给定一个Person 实例)。

如果你绝对必须提供这样的方法,你

  • 应该记录返回的 token 可能是 null(或更有意义的东西,例如 None)并且如果您的客户想要一个有效值,他们必须重试.

  • 应该提供一个监听器来更新此方法读取的 token 的线程安全容器。

谷歌搜索,我找到了 Firebase documentation .这似乎也表明采取行动成功(以延续方式):

FirebaseAuth.getInstance().createCustomToken(uid)
    .addOnSuccessListener(new OnSuccessListener<String>() {
        @Override
        public void onSuccess(String customToken) {
            // **Send token back to client**
        }
    });

尝试提供此类 API 的另一个问题是,一些微不足道的代码显然很复杂。数据流变得相当复杂且难以理解。

如果您可以接受阻塞作为解决方案,那么也许您可以使用 Callable-Future 样式,您传递一个 Callable 然后稍后执行一个 get()在可能阻塞的 Future 上。但我不确定这是否是一个好的设计选择。

关于Java 事件监听器返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42578639/

相关文章:

java - IBM-IEEE double 浮点字节转换

java - 如何让 JLabel 在不可见时占用空间?

java - 如何将无限进度添加到网络浏览器

java - org.apache.log4j.Logger 无法解析尽管 Maven 依赖项

Java语法: Who can an interface be an object?

Java包定义

java - Java流中continue关键字的等价物?

java - 普通 Java 持久性和 JavaFX 表示层 : approach for class design?

java - 了解 getInputStream 和 getOutputStream

java - 使用正则表达式替换单词