PendingResult <PlaceBuffer>setResultCallback Delay - PullRequest
0 голосов
/ 19 октября 2018

Я создал приложение, в котором список мест сохраняется в базе данных.Я сохранил только идентификаторы мест для сохраненных мест в соответствии с документацией 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

    }

1 Ответ

0 голосов
/ 19 октября 2018

Я изменил код.Вместо использования setResultCallback я должен использовать вместо этого await ().

, поэтому новый код должен быть таким:

PlaceBuffer places = placeResult.await();

, затем удалить

placeResult.setResultCallback(new ResultCallback<PlaceBuffer>() {
                @Override
                public void onResult(@NonNull PlaceBuffer places) {
...