Обратите внимание, что я не знаю тех API, с которыми вы работаете, но теоретически вы должны иметь возможность играть с CompletableFuture
, например, с чем-то вроде этого (не тестировалось):
private CompletableFuture<List<String>> runGeoQuery(double latitude, double longitude) {
CompletableFuture<List<String>> future = new CompletableFuture<>();
GeoQuery geoQuery = geoFire.queryAtLocation(new GeoLocation(latitude, longitude), 2000);
geoQuery.addGeoQueryEventListener(new GeoQueryEventListener() {
private final List<String> businessIds = new ArrayList<>();
@Override
public void onKeyEntered(String key, GeoLocation location) {
businessIds.add(key);
}
@Override
public void onKeyExited(String key) {
}
@Override
public void onKeyMoved(String key, GeoLocation location) {
}
@Override
public void onGeoQueryReady() {
future.complete(businessIds);
}
@Override
public void onGeoQueryError(DatabaseError error) {
future.completeExceptionally(error);
}
});
return future;
}
Затем вы можете либо скомпоновать результат с помощью #thenApply или #thenCompose, либо просто заблокировать с помощью # get.
Примечание, просто убедитесь, что блокировка подходит для вашего случая. Один из примеров, когда не должно быть в порядке, - это когда поток, выполняющий этот код, исходит из пула HTTP-запросов (например, Netty), так как это может создать конкуренцию и остановить ваш веб-сервер, обрабатывающий новые запросы.