Подождите, пока onDataChange () завершится, прежде чем продолжить метод - PullRequest
1 голос
/ 27 февраля 2020

У меня есть блок кода, который вызывается перед другим блоком кода. Я хочу, чтобы первый блок кода выполнялся полностью, прежде чем будет вызван другой код, так как в противном случае он будет нулевым. Код показан ниже

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));
        }

Очевидно, что это не весь метод, но я хочу сказать, что l oop внизу вызывается перед предыдущим кодом из-за асинхронных вызовов. Мне нужен способ убедиться, что приведенный выше код выполняется первым, чтобы размер массива в l oop не был нулевым. Я отладил код, и массив обычно не пуст / пуст, поэтому я на 100% уверен, что это асинхронный вызов, который вызывает проблему пустого массива в l oop. Я ищу способ синхронизации кода, я пытался использовать ключевое слово «synchronized» в функциях, и я даже пытался создать один поток для всей функции, но это не помогло мне. Любая помощь приветствуется. Спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...