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

Android应用中AWS Amplify DataStore查询异步问题求助

问题原因

Amplify DataStore的query方法是异步执行的:调用该方法后,主线程会立即继续执行后续代码(比如System.out.println("getUsers() exit");),而查询逻辑和结果处理的回调会在后台线程完成数据查询后才触发,这就是你看到输出顺序颠倒的根本原因。你尝试的线程join和AsyncTask无效,因为Amplify内部已经封装了异步逻辑,外部包裹线程无法改变回调的触发时机。

解决方案

方案1:自定义回调接口(Java原生实现)

通过自定义回调,在查询完成后获取用户列表并处理:

  1. 定义回调接口
public interface UserQueryCallback {
    void onSuccess(List<User> users);
    void onFailure(Throwable error);
}
  1. 修改getUsers方法,传入回调并在查询完成后触发
public void getUsers(UserQueryCallback callback) {
    Amplify.DataStore.query(
        User.class,
        items -> {
            List<User> userList = new ArrayList<>();
            while (items.hasNext()) {
                User item = items.next();
                userList.add(item);
                System.out.println("Username: " + item.getUsername());
                Log.i("Amplify", "Id " + item.getId());
            }
            // 切换回主线程处理结果(避免UI操作报错)
            new Handler(Looper.getMainLooper()).post(() -> {
                callback.onSuccess(userList);
            });
        },
        failure -> {
            Log.e("Amplify", "Could not query DataStore", failure);
            new Handler(Looper.getMainLooper()).post(() -> {
                callback.onFailure(failure);
            });
        }
    );
}
  1. 在按钮点击事件中调用并处理结果
Button btnQuery = findViewById(R.id.btnQuery);
btnQuery.setOnClickListener(new View.OnClickListener() {
    public void onClick(View view) {
        System.out.println("Button click registered.");

        getUsers(new UserQueryCallback() {
            @Override
            public void onSuccess(List<User> users) {
                // 这里可以安全处理用户列表
                System.out.println("getUsers() completed");
                System.out.println(users);
                // 比如更新UI、存入全局变量等操作
            }

            @Override
            public void onFailure(Throwable error) {
                // 处理查询失败的情况
            }
        });

        System.out.println("getUsers() called (async task started)");
    }
});

方案2:使用LiveData(适配Android MVVM架构)

如果你的项目采用MVVM架构,用LiveData可以更优雅地处理异步数据更新:

  1. 在Activity/ViewModel中定义LiveData
private MutableLiveData<List<User>> userListLiveData = new MutableLiveData<>();
  1. 实现查询逻辑并更新LiveData
public void getUsers() {
    Amplify.DataStore.query(
        User.class,
        items -> {
            List<User> userList = new ArrayList<>();
            while (items.hasNext()) {
                userList.add(items.next());
            }
            // 主线程更新LiveData
            new Handler(Looper.getMainLooper()).post(() -> {
                userListLiveData.setValue(userList);
            });
        },
        failure -> {
            Log.e("Amplify", "Query failed", failure);
            new Handler(Looper.getMainLooper()).post(() -> {
                userListLiveData.setValue(null);
            });
        }
    );
}
  1. 观察LiveData获取结果
// 在Activity的onCreate方法中添加观察
userListLiveData.observe(this, users -> {
    if (users != null) {
        // 处理获取到的用户列表
        System.out.println(users);
    }
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 15:52:50