等待onDataChange()完成,然后继续该方法

时间:2020-02-26 21:29:18

标签: java android firebase methods synchronize

我有一个代码块在另一个代码块之前被调用。我希望第一段代码在其他代码被调用之前完全执行,否则为null。代码如下所示

public void displayGraph1() {
        xnumsList = new ArrayList<>();
        namesList = new ArrayList<>();
        xxx = new ArrayList<>();
        DatabaseReference ref = FirebaseDatabase.getInstance().getReference().child("child");
        ref.addValueEventListener(new ValueEventListener() {
            @Override
            public synchronized void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                for (DataSnapshot child : dataSnapshot.getChildren()) {
                    key = child.getKey();
                    DatabaseReference checkingWhoisInWhatChild = FirebaseDatabase.getInstance().getReference().child("child").child(key);
                    checkingWhoisInWhatClass.addValueEventListener(new ValueEventListener() {
                        @Override
                        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                            String module = dataSnapshot.child("a").getValue().toString();
                            String xnum = dataSnapshot.child("b").getValue().toString();
                            for (int i = 0; i < arrayOfModules.size(); i++) {

                                String lecturerModule = arrayOfModules.get(i);
                                if (module.equals(lecturerModule)) {
                                    xxx.add(xnum);
                                }
                            }                          
                        }

                        @Override
                        public void onCancelled(@NonNull DatabaseError databaseError) {

                        }
                    });
                }                
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }
        });
        //null array
        for (int i = 0; i < xxx.size(); i++) {
            Log.d("dddd", "arraycontents" + xxx.get(i));
        }

显然,这不是整个方法,但我的意思是,由于异步调用,底部循环在前面的代码之前被调用。我想要一种方法来确保首先执行上面的代码,以便循环中数组的大小不为null。我已经调试了代码,并且数组通常不为空/ null,所以我100%确定这是一个异步调用,该调用导致循环中出现空数组。我正在寻找一种同步代码的方法,我曾尝试在函数上使用关键字“ synchronized”,甚至试图为整个函数创建一个线程,但这尚未证明对我有用。任何帮助表示赞赏。 谢谢

0 个答案:

没有答案