2017-02-21 11 views
1

Я бы хотел прочитать несколько узлов Firebase перед выполнением некоторых действий с извлеченными данными. В настоящее время я выполнил это, вложив каждый запрос в прослушиватель завершения предыдущего запроса, но вложенность делает код сложным для поддержания. Есть ли способ выполнить несколько запросов подряд или одновременно и слушать, когда все они завершены?Как проверить завершение чтения с нескольких узлов в базе данных реального времени Firebase?

+0

Решение общего назначения представлено здесь: http://stackoverflow.com/a/38188683/4815718 –

ответ

3

Пример, если у вас есть два запроса, и вы хотите, чтобы запустить код после того, как они завершили и/или успеха:

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.

+1

Ну, это один из способов сделать это и довольно просто, хотя мне интересно, будет ли снижение производительности для 4 выполненных запросов как это. Я думал создать ArrayList из ValueEventListeners, передать их объекту, который будет запускать их один за другим, использовать пользовательский прослушиватель событий, который будет запускать после завершения одного ValueEventListener для обработки второго и когда все будут обработаны, начнется полное событие завершения и return ArrayList of datasnapshots :) – wilkas

+1

Я буду отвечать на завтра, если не будут предоставлены лучшие решения. – wilkas

+1

В настоящее время я использую запрос 5-6 одновременно с началом приложения. Я не заметил существенной разницы, чем когда я вызываю только один запрос. Но я все еще учусь. Возможно, вы захотите увидеть [эту страницу, которую я только что нашел] (http://stackoverflow.com/questions/35931526/) – koceeng