我创建了一个应用程序,其中,位置列表保存在数据库中。我只根据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
}
答案 0 :(得分:0)
我修改了代码。代替使用setResultCallback,我应该使用await()。
因此新代码应为:
PlaceBuffer places = placeResult.await();
然后删除
placeResult.setResultCallback(new ResultCallback<PlaceBuffer>() {
@Override
public void onResult(@NonNull PlaceBuffer places) {