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

Java 等待onDataChange()完成,然后继续该方法,java,android,firebase,methods,synchronize,Java,Android,Firebase,Methods,Synchronize,我有一段代码在另一段代码之前被调用。我希望在调用另一个代码之前完全执行第一个代码块,否则它将为null。代码如下所示 public void displayGraph1() { xnumsList = new ArrayList<>(); namesList = new ArrayList<>(); xxx = new ArrayList<>(); DatabaseReference ref =

我有一段代码在另一段代码之前被调用。我希望在调用另一个代码之前完全执行第一个代码块,否则它将为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));
        }
public void displayGraph1(){
xnumsList=newarraylist();
namesList=newarraylist();
xxx=新的ArrayList();
DatabaseReference ref=FirebaseDatabase.getInstance().getReference().child(“child”);
ref.addValueEventListener(新的ValueEventListener(){
@凌驾
公共同步的void onDataChange(@NonNull DataSnapshot DataSnapshot){
对于(DataSnapshot子项:DataSnapshot.getChildren()){
key=child.getKey();
DatabaseReference checkingWhoisInWhatChild=FirebaseDatabase.getInstance().getReference().child(“child”).child(键);
检查WhoisinwhatClass.addValueEventListener(新的ValueEventListener(){
@凌驾
public void onDataChange(@NonNull DataSnapshot DataSnapshot){
字符串模块=dataSnapshot.child(“a”).getValue().toString();
字符串xnum=dataSnapshot.child(“b”).getValue().toString();
对于(int i=0;i
很明显,这不是整个方法,但我的观点是,由于异步调用,底部的循环在前面的代码之前被调用。我想要一种方法来确保首先执行上面的代码,以便循环中数组的大小不为null。我已经调试了代码,数组通常不为空/null,因此我是100%确保这是一个异步调用,导致循环中出现空数组的问题。我正在寻找一种同步代码的方法,我尝试在函数上使用关键字“synchronized”,甚至尝试为整个函数创建一个线程,但这对我来说还不起作用。非常感谢您的帮助。
谢谢你

事实上,这是
addValueEventListener
作为一个异步调用的结果。你不应该试图做任何事情来改变这个事实——永远不要阻塞主线程——只要确保你的循环只在调用回调后执行,方法是将代码放入回调中,或者使用一种常用的异步方法编程。我尝试过这一点,但我仍然遇到同样的问题。这是因为我嵌套了此代码所需的for循环。您的for循环使事情变得有点棘手。您可以尝试检查回调中的计数器变量,以跟踪所有回调的处理时间。然后,您可以执行其余的代码一旦它们全部返回,请检查。事实上,这是
addValueEventListener
作为异步调用的结果。您不应该试图做任何事情来改变这一事实-永远不要阻止主线程-只需确保您的循环仅在调用回调后执行,方法是将代码放入回调中,或使用异步编程的常用方法。我尝试过这一点,但仍然遇到同样的问题。这是因为我嵌套了代码所需的for循环。你的for循环会让事情变得有点棘手。你可以尝试检查回调中的计数器变量,以跟踪所有回调的处理时间。然后,你可以在所有代码返回后执行其余代码。签出。