Что-то вроде этого должно работать:
final CountDownLatch latch = new CountDownLatch(1);
final AtomicReference<Object> value = new AtomicReference<>(null);
final AtomicReference<Exception> exception = new AtomicReference<>(null);
ref.getReference().addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot snapshot) {
value.set(snapshot.getValue());
latch.countDown();
}
@Override
public void onCancelled(DatabaseError error) {
exception.set(error.toException());
latch.countDown();
}
});
latch.await(30, TimeUnit.SECONDS);
if (exception.get() != null) {
// handle error
}
Object result = value.get();
// return result to user
Я бы порекомендовал переместить всю логику синхронизации (с защелкой и атомными ссылками) в новый класс многократного использования, чтобы код стал простым иболее читабельно.