Android应用中AWS Amplify DataStore查询异步问题求助
问题原因
Amplify DataStore的query方法是异步执行的:调用该方法后,主线程会立即继续执行后续代码(比如System.out.println("getUsers() exit");),而查询逻辑和结果处理的回调会在后台线程完成数据查询后才触发,这就是你看到输出顺序颠倒的根本原因。你尝试的线程join和AsyncTask无效,因为Amplify内部已经封装了异步逻辑,外部包裹线程无法改变回调的触发时机。
解决方案
方案1:自定义回调接口(Java原生实现)
通过自定义回调,在查询完成后获取用户列表并处理:
- 定义回调接口
public interface UserQueryCallback { void onSuccess(List<User> users); void onFailure(Throwable error); }
- 修改
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); }); } ); }
- 在按钮点击事件中调用并处理结果
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可以更优雅地处理异步数据更新:
- 在Activity/ViewModel中定义LiveData
private MutableLiveData<List<User>> userListLiveData = new MutableLiveData<>();
- 实现查询逻辑并更新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); }); } ); }
- 观察LiveData获取结果
// 在Activity的onCreate方法中添加观察 userListLiveData.observe(this, users -> { if (users != null) { // 处理获取到的用户列表 System.out.println(users); } });
内容的提问来源于stack exchange,提问作者GMac06
相关产品推荐
相关产品推荐

