如何确保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
相关产品推荐
相关产品推荐

