android - Firebase:嵌套循环结果乱序
问题描述
我想为 Firebase 数据创建一个嵌套循环,但结果不正确。我知道 Firebase 是异步运行的,但我不知道如何解决这个问题。请帮我解决这个问题。
编码:
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_recommend, container, false);
text = view.findViewById(R.id.test);
fuser = FirebaseAuth.getInstance().getCurrentUser();
getInfo();
return view;
}
private void getInfo() {
FirebaseDatabase.getInstance().getReference().child("users").addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
for (DataSnapshot dataSnapshot : snapshot.getChildren()) {
User user = dataSnapshot.getValue(User.class);
assert user != null;
System.out.println("user " + user.getId() + "");
FirebaseDatabase.getInstance().getReference().child("Posts").addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
for (DataSnapshot datasnapshot : snapshot.getChildren()) {
Post post = datasnapshot.getValue(Post.class);
System.out.println("posts " + post.getPostid() + "");
}
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
}
});
}
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
}
});
}
结果:
I/System.out: user 3JErhGpZ1IYGswKZNOTJGY7mAU13
I/System.out: user AiHsIMRL4zd9YkdkMEhY0MRhHDU2
I/System.out: user EXmknYFLpqcAHcvbcIUJYSTtDdl1
I/System.out: user KV4tUuczuUbWLz3DR0gLn8STmF73
I/System.out: user Lg8eMt56NOOAXx5PAPrYrbVnE533
I/System.out: user QOMfQ4Vhk6cOniAsj2YnMnxRP8W2
I/ System.out: user Tnd20qA2g6VPr9s69ziPjou8K113
I/System.out: user YsJCUD3lq2OsVknxcRqOTQNGFpP2
I/System.out: user c8QABIe3zxNIZRCCbpvkHMd138x2
I/System.out: user pBfZlyWmGrc6h4bcLLl4Re4MHe53
I/System.out: user rRHFEuawGsMoUDzrIUaycBKy5653
I/System.out: user xUWVqIoBKsaM8eq9pm1ky0YGm5R2
I/System.出:帖子-MMpqMPistmQyGm-_NpM
I/System.out:帖子-MNTf7Hf6Eo_uB_jTXuw
I/System.out:帖子-MNTluR0nSJARQ_tosL0
I/System.out:帖子-MMpqMPistmQyGm-_NpM
I/System.out:帖子-MNTf7Hf6Eo_uB_jTXuw
I/System.out:帖子-MNTluR0nSJARQ_tosL0
I/System.out:帖子-MMpqMPistmQyGm-_NpM
I /System.out:发布-MNTf7Hf6Eo_uB_jTXuw
I/System.out:发布-MNTluR0nSJARQ_tosL0
I/System.out:发布-MMpqMPistmQyGm-_NpM
I/System.out:发布-MNTf7Hf6Eo_uB_jTXuw
I/System.out:发布-MNTluR0nSJARQ_tosL0
I/System。出:帖子-MMpqMPistmQyGm-_NpM
I/System.out:帖子-MNTf7Hf6Eo_uB_jTXuw
I/System.out:帖子-MNTluR0nSJARQ_tosL0
帖子-MMpqMPistmQyGm-_NpM
I/System.out:帖子-MNTf7Hf6Eo_uB_jTXuw
I/System.out:帖子-MNTluR0nSJARQ
I/System.out:帖子-MMpqMPistmQyGm-_NpM
I/System.out:帖子-MNTf7Hf6Eo_uB_jTXuw
I/System.out:帖子-MNTluR0nSJARQ_tosL0
I/System.out:帖子-MMpqMPistmQyGm-_NpM
I/System.out:帖子-MNTf7Hf6Eo_uB_jTXuw
I /System.out:帖子-MNTluR0nSJARQ_tosL0
I/System.out:帖子-MMpqMPistmQyGm-_NpM
I/System.out:帖子-MNTf7Hf6Eo_uB_jTXuw
I/System.out:帖子-MNTluR0nSJARQ_tosL0
I/System.out:帖子-MMpqMPistmQyGm-_NpM
I/ System.out:发布-MNTf7Hf6Eo_uB_jTXuw
I/System.out:发布-MNTluR0nSJARQ_tosL0
I/System.out:发布-MMpqMPistmQyGm-_NpM
I/System.out:发布-MNTf7Hf6Eo_uB_jTXuw
I/System.out:发布-MNTluR0nSJARQ_tosL0
I/System.out:发布-MMpqMPistmQyGm-_NpM
I/System.out:发布-MNTf7Hf6Eo_uB_jTXuw
I/System.out:发布-MNTluR0nSJARQ_tosL0
在我的 Firebase 中,我有 12 个用户和 3 个帖子,因此System.out.println("posts "+post.getPostid()+"");
打印了 36 次。我希望代码为每个用户打印三个帖子,因为嵌套循环同步工作,而不是打印所有用户然后打印帖子,如何解决?
解决方案
从 Firebase 数据库获取数据时使用嵌套循环并不能保证您的结果与循环的顺序一致。发生这种情况是因为循环中的每个 onDataChange() 方法都有其异步行为,因此嵌套这些循环并不能解决执行顺序。
不幸的是,您无法知道何时完成从数据库中获取数据以便调用第二个循环。发生这种情况是因为 Firebase 是一个实时数据库,并且可能永远无法完成获取数据。这就是为什么被命名为实时数据库的原因,因为在任何时候都可以更改数据库,可以添加或删除项目。
推荐阅读
- javascript - 如何检查 Typescript 对象数组中的多个值?
- javascript - AngularJS,谷歌浏览器阻止我的应用程序发出发布请求,需要帮助添加标题
- java - 在 TinyMCE 中为流 Vaadin 组件使用自定义皮肤时遇到问题
- spring-boot - 收到错误 java.nio.file.AccessDeniedException
- c - 如何通过套接字连接从命令行传递字符串
- javascript - 减少 React 表单验证中的 if 数量
- powershell - 所有 AD 用户的 Powershell 删除
- amazon-web-services - Terraform 错误:运行 terraform init 时模块的无关标签
- jquery - require.js 和 jquery UI 小部件的淘汰赛可排序问题
- azure - Azure:从应用服务访问 Key Vault 时,如何解决“策略要求调用者'...'使用代表 (OBO) 流”?