AWS Amplify Android项目通过API Gateway读取DynamoDB数据异常求解
问题根因
你遇到的列表大小始终为0的问题,本质是异步执行时序问题:Amplify.API.get() 是异步非阻塞方法,调用后会立刻返回,网络请求、成功/失败回调的执行都在后台线程延后执行。你在方法末尾打印ls.size()时,成功回调还没有被触发,自然还没有执行ls.add(rawData)的逻辑,所以列表始终是空的,这和你后端服务、接口返回是否正常没有关系。
解决方案
你需要通过回调机制,在网络请求成功拿到返回结果后,再执行列表操作、UI更新等后续逻辑,不要在接口调用后立刻处理数据。
1. 定义数据回调接口
public interface OnDataFetchedListener { void onSuccess(String rawData); void onFailure(Throwable error); }
2. 改造getItems方法支持回调
void getItems(String epoch, OnDataFetchedListener listener) { RestOptions options = RestOptions.builder() .addPath("/items/" + epoch) .build(); Amplify.API.get(options, restResponse -> { String rawData = restResponse.getData().asString(); Log.i("RESTapiOperation", "GET succeeded: " + rawData); // 回调通知成功 if (listener != null) { listener.onSuccess(rawData); } }, apiFailure -> { Log.e("RESTapiOperation", "GET failed: ", apiFailure); // 回调通知失败 if (listener != null) { listener.onFailure(apiFailure); } } ); }
3. 调用方法处理数据
如果后续需要把数据展示到界面上,注意Android的UI更新必须在主线程执行:
// 调用接口获取数据 getItems("你的epoch参数", new OnDataFetchedListener() { @Override public void onSuccess(String rawData) { // 这里才是数据返回后的执行时机 ls.add(rawData); Log.i("Data Collection", "Size of list is " + ls.size()); // 如果要更新UI,切到主线程 runOnUiThread(() -> { // 这里更新列表控件、TextView等UI元素 }); } @Override public void onFailure(Throwable error) { // 处理请求失败的逻辑,比如弹Toast提示 } });
额外优化建议
- 你拿到的
rawData一般是JSON格式字符串,可以用Gson、FastJSON等工具直接解析成对应的实体类,方便后续字段读取,不用手动处理字符串。 - 如果需要展示IoT设备的实时上报数据,不需要频繁轮询REST接口,可以改用Amplify的GraphQL API搭配DynamoDB Streams实现数据主动推送,延迟更低性能更好。
内容的提问来源于stack exchange,提问作者average_programmer
相关产品推荐
相关产品推荐

