Я создал приложение, в котором список мест сохраняется в базе данных.Я сохранил только идентификаторы мест для сохраненных мест в соответствии с документацией Google.
Затем я создал интерфейс для ввода пользователем текущего местоположения (mCurrentLocation).
Затем я создал Asynctask для прохождения каждого из идентификаторов мест, сохраненных в базе данных, и проверки, какие из мест находятся в пределах 500 метров от местоположения пользователя.Это делается в doInBackground.Согласно документации Google, я использовал getPlaceById и setResultCallback
. В postExecute обновляется представление Recycler.
ВЫПУСК: PendingResult setResultCallback, кажется, имеет задержки.Согласно моим журналам, PostExecute вызывается уже, в то время как setResultCallback еще не закончен!В результате мое представление Recycler не видит все результаты
LOGS:
Внутри для цикла
Внутри для цикла
Внутри для цикла
для выхода из цикла
введено onPostExecute
Внутри для цикла
Внутри для цикла
@ Переопределить защищенный список doInBackground (List ... lists) {
ArrayList<Places> selectedPlaces = new ArrayList<>();
for ( int i = 0; i < lists[0].size(); i++) {
// Get the place from the placeID
PendingResult<PlaceBuffer> placeResult = Places.GeoDataApi.
getPlaceById(mGoogleApiClient, lists[0].get(i).getAddress());
placeResult.setResultCallback(new ResultCallback<PlaceBuffer>() {
@Override
public void onResult(@NonNull PlaceBuffer places) {
Log.v(LOG_TAG, "Inside for loop");
// Get the latitude and longitude for the specific place
LatLng latLng = places.get(0).getLatLng();
// Set the location object for the specific place
Location A = new Location("Place");
A.setLatitude(latLng.latitude);
A.setLongitude(latLng.longitude);
// get the distance of the place from the selected location
float distance = A.distanceTo(mUserLocation);
// if the distance is less than 500m
if (distance < 500) {
selectedPlaces.add(lists[0].get(position));
}
}
});
}
Log.v(LOG_TAG, "for loop exited");
return selectedPlaces;
}
@Override
protected void onPostExecute(List<Places> places) {
Log.v(LOG_TAG, "onPostExecute entered");
//update Recycler view
}