当前位置: 首页 > 知识库问答 >
问题:

具有异步调用的匕首返回类型

唐彬炳
2023-03-14

当使用使用回调的第三方函数时,我试图返回指定的类型。我有一个接口

public interface AuthenticationService {
    AuthResult signInEmailPassword(String username, String password, AuthListener listener);
}

在实现接口时,我调用了一个使用回调的AWS Cognito异步函数。

public class AwsCognitoAuthenticator implements AuthenticationService {
    @Override
    public AuthResult signUp(String givenName, String username, String password, final AuthListener listener) {
        userPool.signUpInBackground(username, password, userAttributes, null, signupCallback);
    --> return result from signupCallback;
    }
}

在调用此方法时,如何仍返回身份验证结果的类型(注册在后台)?(我不想将其更改为 void,以便我可以在界面上使用匕首)。

编辑

我在dagger中尝试了许多不同的方法,但都不成功。我试图将下面的界面作为一个字段注入到一个活动中。

@Component(modules = LoginModule.class)
public interface AuthenticationService {
    void signUp(String givenName, String username, String password, AuthListener listener);
    void signInEmailPassword(String username, String password, AuthListener listener);
    void changePassword(String oldPassword, String newPassword);
    void resetPassword();
    void signOut();
}

组件

@Module
public class LoginModule {
    @Provides
    AuthenticationService provideAuthService() {
        return new AwsCognitoAuthenticator();
    }
}

然后我得到三个声明的错误,这些声明在接口中有参数

错误:此方法不是有效的设置方法、成员注入方法或子组件工厂方法。Dagger无法实现此方法

共有1个答案

景高杰
2023-03-14

您不应该注释使用@Component实现的接口@Component具体地说,是指定义您希望Dagger为您实现的绑定图的接口。

@Component(modules = LoginModule.class)
public interface AuthenticationComponent {
  AuthenticationService getAuthenticationService();
}

上面的代码告诉Dagger使用您列出的@Module类和它找到的@Inject注释构造函数来创建您在组件上列出的类。在这里,该类是AuthenticationService,并且根据您的LoginModule,您将获得一个具体的AwsCognitoAuthenticator。Dagger在AuthenticationComponent附近生成此实现,以便您可以调用create为您完全创建的AuthenticationService获取工厂:

AuthenticationComponent authComponent = DaggerAuthenticationComponent.create();

因为你有一个绑定,它所做的只是手动调用一个构造函数,所以你不会从Dagger这里得到很多好处。但是,如果你的图随着时间的推移而增长,或者如果你改变AwsCognitoAuthenticator来需要其他依赖项,这很容易发挥它的作用。

既然 Dagger 没有参与您的身份验证服务接口设计,那么您可以专注于制作一个干净的 API。首先,您需要确定身份验证服务的行为是同步的还是异步的。如果要返回 AuthResult,则需要创建它,因此您似乎需要同步行为。也就是说,既然您接受了身份验证通知程序,那么您似乎已经为异步行为做好了准备。作为您的API的消费者,我不会理解这一点。请尝试以下操作之一:

> < li>

为您的每个方法接受AuthListener,并使用它进行回调。然后可以返回< code>void。假设您接受的AuthListener有一个方法,可以在后台任务完成时接受AuthResult,并且您知道结果。您的大多数方法将返回< code>void,因为通常没有同步返回的AuthResult。

返回一个ListenableFuture

双击同步API,这样AuthenticationService方法在后台任务完成之前不会返回。在大多数情况下,这是一个坏主意,但这是可能的,然后您可以确保在需要返回时立即拥有AuthResult。

 类似资料:
  • 问题内容: 我在互联网上读过有关回调的信息,但就我而言我还是听不懂。 我具有此功能,并且在运行时会记录到控制台。但是,现在我需要在另一个功能中使用此响应,而我正在努力做到这一点。 这是我应该得到的地方:(这显然不起作用,因为它不等待响应。) 我真的很难把头放在回调上,我在这里盯着自己瞎了。 问题答案: 回调无法返回值,因为它们将要返回的代码已经执行。 因此,您可以做几件事。一个传递回调函数,异步函

  • 问题内容: 我在自己的类中拥有所有异步调用,因此我不想将aync’ly设置为全局变量。为此,我想从我的asunc postProcess方法返回对象,例如字符串。 能做到吗? 下面是我类的一般结构,例如,我想从onPostExecute()返回一个字符串。我看到在其他地方提到了委托,但这似乎很混乱,确定有办法为类或方法提供返回类型吗? 问题答案: 像下面这样 和听众课 你可以这样打电话

  • 问题内容: 我有一个发出异步请求的函数。我如何从中返回响应/结果? 我尝试从回调中返回值,以及将结果分配给函数内部的局部变量并返回该局部变量,但这些方法均未真正返回响应(它们都返回或变量的初始值为任意值) 。 使用jQuery函数的示例: 使用node.js的示例: 使用承诺块的示例: 问题答案: 在 一 中的Ajax代表 异步 。这意味着发送请求(或接收响应)已从正常执行流程中删除。在您的示例中

  • 问题内容: 我正在编写一个函数,该函数采用groupchatID(字符串),并为该群聊返回收件人列表([String])。我正在努力与功能的异步部分。当我运行该函数时,它将正确地将我要查找的用户名数组打印到控制台。虽然,当我调用该函数并尝试打印返回的值时,它始终是一个空数组,因为该函数会在Firebase调用完成之前返回该数组。我正在尝试使用回调,但是我不太了解所有语法。请看一下,让我知道需要更改

  • 使用promise的块的示例:

  • 问题内容: 如标题所示。我该怎么做呢? 我想在forEach循环遍历每个元素并完成一些异步处理后调用。 有可能使它像这样工作吗?当forEach的第二个参数是一个回调函数,该函数一旦经过所有迭代便会运行? 预期产量: 问题答案: 不能提供这种效果(如果可以的话),但是有几种方法可以实现您想要的效果: 使用一个简单的计数器 (由于@vanuan等),这种方法可确保在调用“完成”回调之前处理所有项目。