Java 从lambda表达式中更新AtomicBoolean
我将一个lambda表达式作为参数传递给一个方法,我想修改一个在lambda表达式之外定义的变量 我试过一些方法。目前,我有一个名为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
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是的,我看到了,我的意思是我找不到有关返回类型、所有可选参数等的信息。这很好,这些链接非常有用,谢谢