Как получить результат одного значенияEventListener () и использовать его в другом? - PullRequest
1 голос
/ 22 марта 2019

У меня есть valueEventListener (), который используется для получения данных из Firebase.

Вот первый.

sectionReference.child(classID).addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            for(DataSnapshot snapshot: dataSnapshot.getChildren()){
                uidArrayList.add(snapshot.getKey());
            }
        }
        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {}
    });
}

Я хочу получить список UID в uidArrayList и использовать его для выполнения некоторых других функций.

Вот второй.

mRef.addValueEventListener(new ValueEventListener() {

        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

            getUIDsInCurrentClass();

            for(DataSnapshot snapshot: dataSnapshot.getChildren()){
                User user = snapshot.getValue(User.class);
                if(user.getRole().equals("student") && uidArrayList.contains(user.getUid())){
                    studentArrayList.add(user);
                }

            }
        }

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

В этом втором Слушателе вы видите, что я хочу получить доступ к содержимому uidArrayList . Используя Log.d, я увидел, что размер ArrayList равен 0, что означает, что он не был инициализирован при вызове во втором прослушивателе.

Можно ли каким-либо образом убедиться, что uidArrayList инициализируется со всеми значениями до того, как к нему будет обращаться в следующем ValueEventListener ().

Я пытался сделать это, Обработчики событий и прослушиватели событий, независимые друг от друга

Но у меня это не сработало. Заранее спасибо за ответ.

1 Ответ

1 голос
/ 23 марта 2019

Можно ли каким-либо образом убедиться, что uidArrayList инициализируется со всеми значениями, прежде чем он будет доступен в следующем ValueEventListener ().

Да, это так. Самым простым решением, которое я могу придумать, является использование вложенных запросов. Поэтому второй запрос должен быть вложен в первый, чтобы вы могли быть уверены, что ваш uidArrayList не пустой. Так что код должен выглядеть примерно так:

sectionReference.child(classID).addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
        for(DataSnapshot snapshot: dataSnapshot.getChildren()){
            uidArrayList.add(snapshot.getKey());
        }

        mRef.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                //getUIDsInCurrentClass();
                for(DataSnapshot snapshot: dataSnapshot.getChildren()){
                    User user = snapshot.getValue(User.class);
                    if(user.getRole().equals("student") && uidArrayList.contains(user.getUid())){
                        studentArrayList.add(user);
                    }
                }
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {}
        });
    }
    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {}
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...