Java 从lambda表达式中更新AtomicBoolean

Java 从lambda表达式中更新AtomicBoolean,java,android,asynchronous,aws-lambda,aws-amplify,Java,Android,Asynchronous,Aws Lambda,Aws Amplify,我将一个lambda表达式作为参数传递给一个方法,我想修改一个在lambda表达式之外定义的变量 我试过一些方法。目前,我有一个名为success的AtomicBoolean。在lambda表达式中,我调用success.set(true)。但是,当我记录success变量的值时,它仍然是false并且似乎没有更新 基本上,我调用的是一个返回类型为void的函数,需要知道该函数是否成功 我做错了什么 代码如下: public void createUser(字符串电子邮件、字符串密码){ Ato

我将一个lambda表达式作为参数传递给一个方法,我想修改一个在lambda表达式之外定义的变量

我试过一些方法。目前,我有一个名为
success
AtomicBoolean
。在lambda表达式中,我调用
success.set(true)
。但是,当我记录
success
变量的值时,它仍然是
false
并且似乎没有更新

基本上,我调用的是一个返回类型为void的函数,需要知道该函数是否成功

我做错了什么

代码如下:

public void createUser(字符串电子邮件、字符串密码){
AtomicBoolean成功=新的AtomicBoolean(false);
放大、授权、注册(
电子邮件,
密码,
AuthSignUpOptions.builder()
.userAttribute(AuthUserAttributeKey.email(),电子邮件)
.build(),
结果->成功。设置(真),
错误->日志.e(“AuthQuickStart”,“注册失败”,错误)
);
Log.d(“success”,String.valueOf(success.get());
}

如果
注册
方法被阻塞(即注册完成后返回),则代码应按预期工作。所以我怀疑它是异步的

在这种情况下,除了使用布尔值外,还可以使用
倒计时闩锁
等待异步方法完成:

AtomicBoolean success = new AtomicBoolean(false);
CountDownLatch done = new CountDownLatch(1);
Amplify.Auth.signUp(
        email,
        password,
        AuthSignUpOptions.builder().userAttribute(AuthUserAttributeKey.email(), email).build(),
        result -> { success.set(true); done.countDown(); },
        error -> { Log.e("AuthQuickStart", "Sign up failed", error); done.countDown(); }
);
done.await(); //you may want to add a timeout here
Log.d("success", String.valueOf(success.get()));

正确使用了
AtomicBoolean
变量(
success
)。很可能

Log.d("success", String.valueOf(success.get()));
以前打过电话吗

result -> success.set(true)
因为回调的异步执行。或者根本不调用结果回调

您可以将回调主体更改为:

 result -> {
     Log.d("callback test", "callback start");
     result -> success.set(true);
     Log.d("callback test", "callback end");
}
如果日志中没有出现“回调测试”,则不会调用回调。

如果
“回调测试”
出现在
“success”
之后,则在
Log.d(“success”,String.valueOf(success.get())之后调用回调主体由于异步执行。

@assylias和@jakub bialy的答案完全有效。但是,两者都不考虑
错误
回调。此外,直接使用
倒计时闩锁
有点低级

Amplify提供了一个模块,可以帮助简化异步编程

在您的情况下,您可以这样使用:

//将初始化更改为:
rxampplify.addPlugin(新的AWSCognitoAuthPlugin())
配置(getApplicationContext())
//以分块方式注册:
AuthSignUpOptions=AuthSignUpOptions.builder()
.userAttribute(AuthUserAttributeKey.email(),电子邮件)
.build();
AuthSignUpResult结果=
RxAmplify.Auth.signUp(电子邮件、密码、选项)
.超时(10,时间单位为秒)
.blockingGet();

本例中的
signUp(…)
调用将以阻塞方式在发出调用的线程中抛出
错误。在其他答案中,此
错误被忽略。

请向我们展示代码-很难找出我们看不到的代码中的错误。如果你能把这个减少到a,那就更好了。是的,你的描述没有错,需要一个代码示例。对不起,我已经用代码更新了now@Brian16446您确定回调在退出该方法之前运行吗?我怀疑
signUp
方法是异步的:它立即返回并在另一个线程上运行。所以当你检查它时,你的布尔值还不会被设置。我试着在网上寻找注册方法,但在任何地方都找不到,而且android amplify文档也不是很好。我来试试这个thanks@Brian16446注册(…)
方法记录在“注册用户”部分:@Jameson是的,我看到了,我的意思是我找不到有关返回类型、所有可选参数等的信息。这很好,这些链接非常有用,谢谢