У меня есть список строк, и этот список содержит имена узлов в базе данных Firebase.
И у меня есть собственный метод сортировки, поэтому я хочу получить все ключи для каждого узла в моем пользовательском списке безиспользуя функции сортировки запросов Firebase`.И из-за этого мне нужно получить все данные, поэтому добавление в список при получении некоторых данных не вариант.
Однако проблема начинается с асинхронной структуры Firebase.
Я повторяючерез каждое имя узла в моем настраиваемом списке и под этим циклом я создаю еще один цикл в потоке Firebase` (addListenerForSingleValueEvent), чтобы получить все ключи.Но это работает асинхронно.Я пытался изменить его на синхронный, используя Thread и Semaphore, но это не сработало.Я также использовал пользовательский интерфейс (FirebaseDataRetrieveListener), чтобы указать, когда завершается цикл в valueEventListener, но так как valueEventListener мгновенно возвращает это, это невозможно без остановки потока.
Если Задача может использоваться в этой ситуации, как это может быть, или есть ли другие решения?
private void getKeysFromNodeList(final FirebaseDataRetrieveListener listener) //TODO [BUG] when first for loop initializes it ignores the seperate thread in the inner anonymous class so it'll be already finished it's cycle before Firebase` loop starts...
{
listener.onStart();
final DatabaseReference databaseRef = firebaseInstance.rootRef.child(context.getString(R.string.databaseref));
for (iterator = 0; iterator < nodeList.size(); iterator ++)
{
Query query = databaseRed.child(nodeList.get(iterator));
query.addListenerForSingleValueEvent(new ValueEventListener()
{
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot)
{
for (DataSnapshot snap : dataSnapshot.getChildren())
{
iterator++;
String key= snap.getKey();
// I've done my jobs with given key here
// if got the last key from node and iterated the last node
if (firebaseIterator== dataSnapshot.getChildrenCount() - 1 && iterator == nodeList.size() - 1)
{
firebaseIterator= 0;// reset the iterators
iterator= 0;
listener.onSuccess();
break;
}
// if got the last key from node
else if (firebaseIterator== dataSnapshot.getChildrenCount() - 1)
{
firebaseIterator= 0; // reset the iterator
break;
}
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError)
{
listener.onFailed(databaseError);
return;
}
});
}
;
}
}
FirebaseDataRetrieveListener.java
public interface FirebaseDataRetrieveListener
{
public void onStart();
public void onSuccess();
public void onFailed(DatabaseError databaseError);
}