PendingResult <placebuffer> setResultCallback延迟

时间:2018-10-19 02:44:38

标签: android google-api google-places-api android-pendingintent

我创建了一个应用程序,其中,位置列表保存在数据库中。我只根据Google文档保存了已保存的地方的地方ID。

然后我创建了一个界面,供用户输入其当前位置(mCurrentLocation)。

然后,我创建了一个Asynctask,以遍历数据库中保存的每个场所ID,并检查哪个场所在用户位置的500米范围内。这是在doInBackground中完成的。根据Google文档,我使用了getPlaceById和setResultCallback

在postExecute中,“回收者”视图已更新。

问题:PendingResult setResultCallback似乎有延迟。根据我的日志,setResultCallback尚未完成时就已经调用了PostExecute!结果,我的Recycler视图无法看到所有结果

日志:

内部循环

内部循环

内部循环

for循环已退出

onPostExecute已输入

内部循环

内部循环

@Override 受保护的列表doInBackground(列表...列表){

        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 :(得分:0)

我修改了代码。代替使用setResultCallback,我应该使用await()。

因此新代码应为:

PlaceBuffer places = placeResult.await();

然后删除

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