首页 > 解决方案 > 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 次。我希望代码为每个用户打印三个帖子,因为嵌套循环同步工作,而不是打印所有用户然后打印帖子,如何解决?

标签: androidfirebase-realtime-database

解决方案


从 Firebase 数据库获取数据时使用嵌套循环并不能保证您的结果与循环的顺序一致。发生这种情况是因为循环中的每个 onDataChange() 方法都有其异步行为,因此嵌套这些循环并不能解决执行顺序。

不幸的是,您无法知道何时完成从数据库中获取数据以便调用第二个循环。发生这种情况是因为 Firebase 是一个实时数据库,并且可能永远无法完成获取数据。这就是为什么被命名为实时数据库的原因,因为在任何时候都可以更改数据库,可以添加或删除项目。


推荐阅读