gpt4 book ai didi

java - 带有异步调用的 Dagger 返回类型

转载 作者:行者123 更新时间:2023-11-30 10:08:42 24 4
gpt4 key购买 nike

我试图在使用利用回调的第 3 方函数时返回指定类型。我有一个界面

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

在实现接口(interface)时,我调用了一个使用回调的 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;
}
}

如何在调用此方法(signUpInBackground)时仍然返回 AuthResult 的类型? (我不想把它改成void,这样我就可以在界面上使用dagger了)。

编辑

我在 dagger 中尝试了很多不同的方法,但都没有成功。我正在尝试将以下接口(interface)作为字段注入(inject)到 Activity 中。

@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();
}
}

然后我得到接口(interface)中有参数的三个声明的错误

error: This method isn't a valid provision method, members injection method or subcomponent factory method. Dagger cannot implement this method

最佳答案

你不应该注释你用 @Component 实现的接口(interface). @Component具体来说,是指定义您希望 Dagger 为您实现的绑定(bind)图的接口(interface)。

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

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

AuthenticationComponent authComponent = DaggerAuthenticationComponent.create();

因为您只有一个绑定(bind)并且它所做的只是手动调用一个构造函数,所以您不会在这里从 Dagger 中获得很多好处。但是,如果您的图随着时间的推移而增长,或者如果您更改 AwsCognitoAuthenticator 以需要其他依赖项,这可以轻松地发挥作用。


现在 Dagger 不参与您的 AuthenticationService 接口(interface)设计,您可以专注于制作一个干净的 API。首先,您需要确定 AuthenticationService 的行为是同步的还是异步的。如果要返回 AuthResult,则需要创建它,因此您似乎需要同步行为。也就是说,由于您接受了 AuthListener,您似乎已经为异步行为做好了准备。作为您 API 的使用者,我无法理解这一点。请尝试以下操作之一:

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

  • 返回 ListenableFuture<AuthResult>而不是 AuthResult。这意味着 API 的返回值是一个对象,可以接受在 AuthResult 准备好时调用的监听器,因此您不再需要接受 AuthListener 作为参数。这稍微昂贵一些,因为 ListenableFuture 需要数据结构来接受任意数量的监听器,但它可能会更好地组合(如果,比如说,您需要同时监听多个 ListenableFuture 实例)。

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

关于java - 带有异步调用的 Dagger 返回类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53660914/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com