Я новичок в Firebase и работаю над простым проектом. У меня есть способ получить список учителей из Firebase и добавить их письма в ArrayList и вернуться.Дождитесь завершения onChildДобавлено в запросах firebase, Android
public ArrayList<String> getTeacherList() {
temp = new ArrayList();
Firebase node = ref.child("teachers");
Query query = node.orderByChild("subject").equalTo(selected_subject);
query.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
Map<String,Object> value = (Map<String, Object>) dataSnapshot.getValue();
Log.d("TEACHER"," "+value.toString());
Iterator entries = value.entrySet().iterator();
while (entries.hasNext()) {
Map.Entry thisEntry = (Map.Entry) entries.next();
String key = (String) thisEntry.getKey();
Object data = thisEntry.getValue();
if(key.equals("email")) {
temp.add(data.toString());
Log.d("ENTRY",": DATA "+data.toString());
}
}
}
@Override
public void onChildChanged(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onChildRemoved(DataSnapshot dataSnapshot) {
}
@Override
public void onChildMoved(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onCancelled(FirebaseError firebaseError) {
}
});
Log.d("RETURN", temp.toString());
return temp;
}
Этот метод работает нормально. Но проблема в том, что это возвращает переменную temp
перед тем, как завершить добавление дочернего элемента.
Например мой Android Monitor такова:
D/RETURN: []
D/УЧИТЕЛЬ: {число = 1, имя = Учитель, [email protected], Заголовок = Физика}
D/ENTRY:: DATA [email protected]
есть ли способ ждать до завершения, что onChildAdded
способ ..?
================================================================================================================================== ===========================
Я так же старался. Но потом он остановился внутри метода.
Даже не отправился Log.d("TEACHER", " " + value.toString());
бирка здесь.
public ArrayList getTeacherList() throws InterruptedException {
temp = new ArrayList();
Firebase node = ref.child("teachers");
Query query = node.orderByChild("subject").equalTo(selected_subject);
semaphore = new Semaphore(0);
query.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
Map<String, Object> value = (Map<String, Object>) dataSnapshot.getValue();
Log.d("TEACHER", " " + value.toString());
Iterator entries = value.entrySet().iterator();
while (entries.hasNext()) {
Map.Entry thisEntry = (Map.Entry) entries.next();
String key = (String) thisEntry.getKey();
Object data = thisEntry.getValue();
if (key.equals("email")) {
setArrayList(data.toString());
Log.d("ENTRY", ": DATA " + data.toString());
}
}
semaphore.release();
}
@Override
public void onChildChanged(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onChildRemoved(DataSnapshot dataSnapshot) {
}
@Override
public void onChildMoved(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onCancelled(FirebaseError firebaseError) {
}
});
semaphore.acquire();
return temp;
}
Ожидание асинхронной работы - это отходы нити. Но если вы настаиваете: мой ответ здесь покажет вам оба варианта: http://stackoverflow.com/questions/33203379/setting-singleton-property-value-in-firebase-listener –
Сэр, я прочитал ваше сообщение и попробовал в вашем путь. Но это не помогло мне. После вызова этого метода программа не обрабатывалась. какие-либо предложения..? –
Я уверен, что код, который я написал, работает. Но хорошей новостью для вас является то, что вы всегда можете взять красную таблетку, упомянутую в этом ответе. В любом случае, это лучший подход. –