Я бы хотел прочитать несколько узлов Firebase перед выполнением некоторых действий с извлеченными данными. В настоящее время я выполнил это, вложив каждый запрос в прослушиватель завершения предыдущего запроса, но вложенность делает код сложным для поддержания. Есть ли способ выполнить несколько запросов подряд или одновременно и слушать, когда все они завершены?Как проверить завершение чтения с нескольких узлов в базе данных реального времени Firebase?
ответ
Пример, если у вас есть два запроса, и вы хотите, чтобы запустить код после того, как они завершили и/или успеха:
Boolean ref1done = false;
Boolean ref2done = false;
// if you need data from snapshot
DataSnapshot result1;
DataSnapshot result2;
ref1done = false;
dataRef1.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
ref1done = true;
result1 = dataSnapshot;
doThisAfter();
}
...
});
ref2done = false;
dataRef2.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
ref2done = true;
result2 = dataSnapshot;
doThisAfter();
}
...
});
...
public function doThisAfter() {
if (ref1done && ref2done) {
// do something
// if you need data from snapshot, it can be accessed from result1 and result2
}
}
Это может быть не лучшим решением, я также по-прежнему искать, если есть является лучшим. Или, может быть, вы можете попробовать использовать EventBus.
Ну, это один из способов сделать это и довольно просто, хотя мне интересно, будет ли снижение производительности для 4 выполненных запросов как это. Я думал создать ArrayList из ValueEventListeners, передать их объекту, который будет запускать их один за другим, использовать пользовательский прослушиватель событий, который будет запускать после завершения одного ValueEventListener для обработки второго и когда все будут обработаны, начнется полное событие завершения и return ArrayList of datasnapshots :) – wilkas
Я буду отвечать на завтра, если не будут предоставлены лучшие решения. – wilkas
В настоящее время я использую запрос 5-6 одновременно с началом приложения. Я не заметил существенной разницы, чем когда я вызываю только один запрос. Но я все еще учусь. Возможно, вы захотите увидеть [эту страницу, которую я только что нашел] (http://stackoverflow.com/questions/35931526/) – koceeng
Решение общего назначения представлено здесь: http://stackoverflow.com/a/38188683/4815718 –