You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何确保AWS Amplify查询执行完成后再继续代码运行?

Java Amplify 同步查询实现方案

Amplify的API.query默认是异步执行的,要让主线程等待查询完成后再执行后续依赖逻辑,以下是经过验证的两种可行实现:

方案一:CountDownLatch 实现

核心要点

必须在成功和失败的回调中都调用countDown(),否则若查询出错,主线程会无限阻塞。

import java.util.concurrent.CountDownLatch;
import android.util.Log;

// 初始化计数器,计数为1
CountDownLatch queryLatch = new CountDownLatch(1);
Todo queryResult = null;
Exception queryError = null;

Amplify.API.query(
    ModelQuery.get(Todo.class, id),
    response -> {
        queryResult = response.getData();
        Log.i("MyAmplifyApp", "查询成功:" + queryResult.getName());
        queryLatch.countDown(); // 成功完成,计数器减1
    },
    error -> {
        queryError = error;
        Log.e("MyAmplifyApp", "查询失败", error);
        queryLatch.countDown(); // 失败也要减计数器,避免主线程死等
    }
);

// 主线程阻塞等待查询完成
try {
    queryLatch.await();
} catch (InterruptedException e) {
    Log.e("MyAmplifyApp", "等待被中断", e);
    Thread.currentThread().interrupt(); // 恢复线程中断状态
}

// 执行后续依赖逻辑
if (queryError != null) {
    // 处理查询失败的情况
    throw new RuntimeException("Todo查询失败", queryError);
} else {
    // 使用查询结果执行后续操作
    Log.i("MyAmplifyApp", "后续逻辑执行:获取到Todo名称为" + queryResult.getName());
    // 这里写你的业务代码
}

方案二:CompletableFuture 实现(Java 8+)

核心要点

用CompletableFuture包装异步回调,通过get()方法阻塞主线程等待结果,同时优雅处理成功/失败场景。

import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
import android.util.Log;

CompletableFuture<Todo> todoFuture = new CompletableFuture<>();

Amplify.API.query(
    ModelQuery.get(Todo.class, id),
    response -> {
        Todo todo = response.getData();
        Log.i("MyAmplifyApp", "查询成功:" + todo.getName());
        todoFuture.complete(todo); // 成功时返回结果
    },
    error -> {
        Log.e("MyAmplifyApp", "查询失败", error);
        todoFuture.completeExceptionally(error); // 失败时抛出异常
    }
);

// 主线程阻塞等待结果
try {
    Todo queryResult = todoFuture.get();
    // 后续依赖逻辑
    Log.i("MyAmplifyApp", "后续逻辑执行:获取到Todo名称为" + queryResult.getName());
    // 这里写你的业务代码
} catch (InterruptedException e) {
    Log.e("MyAmplifyApp", "等待被中断", e);
    Thread.currentThread().interrupt();
} catch (ExecutionException e) {
    // 处理查询抛出的异常
    Log.e("MyAmplifyApp", "查询执行失败", e.getCause());
    throw new RuntimeException("Todo查询失败", e.getCause());
}

常见问题说明

你之前尝试这些方法未成功,大概率是以下原因:

  • 使用CountDownLatch时,仅在成功回调调用countDown(),未处理失败场景,导致查询出错时主线程一直阻塞。
  • 原子布尔值的循环检查中,Thread.sleep()可能导致线程调度问题,且未正确同步线程状态。

内容的提问来源于stack exchange,提问作者k1r4n

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 10:22:39