Фон: у меня есть список строк, который содержит различные идентификаторы мест.Как только пользователь выбрал свое местоположение, у меня есть цикл, который выполняется и определяет, находится ли каждое место в списке (я получаю местоположение по идентификатору места) рядом с его выбранным местоположением.Я смог реализовать это с помощью старого Places SDK, но не смог перенести его на новый SDK, поскольку кажется, что новый SDK не имеет эквивалента await ().
Вот мой старый код:
// contains a list of Offices. Has method getId() which contains the Place ID from Google.
List<Office> results = obtained from the database...
// go thru each Location and find those near the user's location
for (int i = 0; i < results.size(); i++) {
// Get the place from the placeID
PendingResult<PlaceBuffer> placeResult = Places.GeoDataApi.
getPlaceById(mGoogleApiClient, results.get(i).getId());
// wait for the result to come out (NEED EQUIVALENT IN NEW PLACES SDK)
PlaceBuffer places = placeResult.await();
// Get the latitude and longitude for the specific Location
LatLng latLng = places.get(0).getLatLng();
// Set the location object for the specific business
Location A = new Location("Business");
A.setLatitude(latLng.latitude);
A.setLongitude(latLng.longitude);
// get the distance of the business from the user's selected location
float distance = A.distanceTo(mSelectedLocation);
// if the distance is less than 50m away
if (distance < 50) { ... do something in code}
Как видно из кода выше, старый API PLACES SDK имеет класс PendingResult с await () в качестве одного из методов.Это await () в соответствии с блоками документации, пока задача не будет завершена. В РЕЗЮМЕ, код не будет продолжаться, пока не будет получен результат из getPlaceById.
Я перенесен в новый Places SDK согласно документации, и у меня естьпроблемы.Вот мой новый перенесенный код, основанный на документации Google: https://developers.google.com/places/android-sdk/client-migration#fetch_a_place_by_id
for (int i = 0; i < results.size(); i++) {
// Get the place Id
String placeId = results.get(position).getId();
// Specify the fields to return.
List<Place.Field> placeFields = Arrays.asList(Place.Field.ID, Place.Field.NAME,
Place.Field.LAT_LNG, Place.Field.ADDRESS);
// Construct a request object, passing the place ID and fields array.
FetchPlaceRequest request = FetchPlaceRequest.builder(placeId, placeFields)
.build();
// Add a listener to handle the response.
placesClient.fetchPlace(request).addOnSuccessListener((response) -> {
Place place = response.getPlace();
// Get the latitude and longitude for the specific location
LatLng latLng = place.getLatLng();
// Set the location object for the specific business
Location A = new Location("Business");
A.setLatitude(latLng.latitude);
A.setLongitude(latLng.longitude);
// get the distance of the business from the selected location
float distance = A.distanceTo(mSelectedLocation);
// if the distance is less than 50m away
if (distance < 50) { ... do something in code}
Кажется, что ключевая проблема здесь заключается в том, что в старом коде await () блокирует код до его успешного завершения, поэтому цикл for выполняетне процесс.Однако это не относится к OnSuccessListener.В результате с новым перенесенным кодом цикл for продолжается и завершает цикл, даже когда fetchPlace еще не завершил получение своих результатов для каждой итерации.Таким образом, код не работает и не может получить необходимые результаты.
Есть ли способ заблокировать код для перемещения до завершения fetchPlace?!