java - 从 lambda 表达式中更新 AtomicBoolean

标签 java android asynchronous aws-lambda aws-amplify

我将 lambda 表达式作为参数传递给方法,并且想要修改在 lambda 表达式外部定义的变量。

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

基本上,我正在调用一个具有 void 返回类型的函数,并且需要知道该函数是否成功。

我做错了什么?

代码如下:

public void createUser(String email, String password) {
    AtomicBoolean success = new AtomicBoolean(false);
    Amplify.Auth.signUp(
        email,
        password,
        AuthSignUpOptions.builder()
            .userAttribute(AuthUserAttributeKey.email(), email)
            .build(),
        result -> success.set(true),
        error -> Log.e("AuthQuickStart", "Sign up failed", error)
    );
    Log.d("success", String.valueOf(success.get()));
}

最佳答案

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

在这种情况下,除了使用 boolean 值之外,您还可以使用 CountDownLatch 来等待异步方法完成:

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

关于java - 从 lambda 表达式中更新 AtomicBoolean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63282617/

相关文章:

java - Java 中 JSON 字符串中的 HTML

android - 尝试使用 Gradle、Robolectric 和 Travis CI 测试 Android 应用程序时出现 NoClassDefFoundError

javascript - Google AdWords 服务器端转换跟踪

java - Maven、Subversion、Javadocs

Java:检查一个数组中的重复值并将更简单的 ID 分配给另一个相同大小的数组

android - 从 View 中心旋转动画不起作用

java - 为什么我的 IDE 在错误的依赖文件夹中查找所需的类?

javascript - 为什么这个使用 await/act/async 的官方 React 测试配方真的有效?

javascript - 使用 Node.js 从 API 填充数据

java - 迭代器移除方法