有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Firebase addValueEventListener是否异步工作?

我正在开发一个聊天应用程序,但当涉及到查看用户的好友请求时,我面临的问题是

当我记录Firebase的查询时,为什么它没有按代码正确排序

这是我的代码:

 // Query for pending requests in the current user
    Log.v("AAAAAA", "AAAAAA");
    usersRef.child(MainActivity.currentUser.getUid()).child("inpendingfriendreq").addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) { // dataSnapShot = inpendingfriendreq node
            for (DataSnapshot reqDataSnapShot : dataSnapshot.getChildren()) {
                U = reqDataSnapShot;
                Log.v("BBBBBBBB", U.toString());
                usersRef.addValueEventListener(new ValueEventListener() {
                    @Override
                    public void onDataChange(DataSnapshot sDataSnapshot) { // sDataSnapshot = "users" node DataSnapShot
                        for (DataSnapshot searchForPendingUserDS : sDataSnapshot.getChildren()) {  // searchForPendingUserDS = a user from database (child node of "users" node)
                            Log.v("CCCCCCC", searchForPendingUserDS.toString());

                            if (searchForPendingUserDS.getKey().equals(U.getKey())) { // If that user's id equals pending req id
                                MainActivity.reqArrList.add(new FriendRequest(R.drawable.default_pp, searchForPendingUserDS.child("name").getValue(String.class)));
                                Log.v("DDDDDDDDD", searchForPendingUserDS.child("name").getValue(String.class));

                            }

                        }
                        Log.v("EEEEEEEE", MainActivity.reqArrList.toString());
                        //requestsPageUpdated();
                    }

                    @Override
                    public void onCancelled(DatabaseError databaseError) {
                        Toast.makeText(mContext, "Error querying", Toast.LENGTH_SHORT).show();
                    }
                });
                //requestsPageUpdated();
                Log.v("FFFFFFFFFF", "FFFFFFFFF");
                break;
            }
        }


        @Override
        public void onCancelled(DatabaseError databaseError) {
            Toast.makeText(mContext, "Error querying", Toast.LENGTH_SHORT).show();
        }

    });

应该是:

AAAAAA
    BBBBBB
        CCCCCC
            DDDDDD
        CCCCCC
        CCCCCC
        CCCCCC
        EEEEEE
    FFFFFF
GGGGGG

但它显示在Logcat中:

AAAAAA
GGGGGG
BBBBBB
FFFFFF
CCCCCC
DDDDDD
CCCCCC
CCCCCC
CCCCCC
EEEEEE

我知道事件侦听器是异步的,但这是什么意思? Async是指函数像Button onClickListener一样等待被触发,还是说当它被触发时,它与主线程并行运行?所以在第二种情况下,这对我的问题是有意义的。 请帮忙


共 (0) 个答案