我的函数 get Nearby Restaurant 未被调用以在 Google Map 上放置标记
Posted
技术标签:
【中文标题】我的函数 get Nearby Restaurant 未被调用以在 Google Map 上放置标记【英文标题】:My function getNearbyRestaurant is not called to place markers on GoogleMap 【发布时间】:2020-07-28 15:46:43 【问题描述】:@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_map);
SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
.findFragmentById(R.id.google_map);
restaurantNearbyRef = FirebaseDatabase.getInstance().getReference().child("Restaurant").child("Info");
fusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(this);
fetchLastLocation();
getNearbyRestaurant();
private ArrayList<Marker> restaurantMarker = new ArrayList<>();
private void fetchLastLocation()
if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.ACCESS_FINE_LOCATION))
ActivityCompat.requestPermissions(this, new String[]
Manifest.permission.ACCESS_FINE_LOCATION, REQUEST_CODE);
return;
Task<Location> task = fusedLocationProviderClient.getLastLocation();
task.addOnSuccessListener(new OnSuccessListener<Location>()
@Override
public void onSuccess(Location location)
if (location != null)
mCurrentLocation = location;
Toast.makeText(getApplicationContext(), mCurrentLocation.getLatitude()
+ "" + mCurrentLocation.getLongitude(), Toast.LENGTH_SHORT).show();
SupportMapFragment supportMapFragment = (SupportMapFragment)
getSupportFragmentManager().findFragmentById(R.id.google_map);
supportMapFragment.getMapAsync(MapActivity.this);
latitude = mCurrentLocation.getLatitude();
longitude = mCurrentLocation.getLongitude();
Log.d(TAG, "The latitude is " + latitude + " and the longitude is " + longitude);
);
public void getNearbyRestaurant()
if (restaurantMarker != null)
for (Marker marker : restaurantMarker)
marker.remove();
GeoFire geoFire = new GeoFire(restaurantNearbyRef);
GeoQuery geoQuery = geoFire.queryAtLocation(new GeoLocation(latitude,longitude),radius);
geoQuery.addGeoQueryEventListener(new GeoQueryEventListener()
@Override
public void onKeyEntered(String key, GeoLocation location)
restaurantMarker
.add(mMap.addMarker(new MarkerOptions().title("Restaurant").icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_BLUE))
.position(new LatLng(location.latitude, location.longitude))));
Log.d(TAG,"The getNearbyRestaurant latitude is " + latitude + "and the longitude is " +longitude );
@Override
public void onKeyExited(String key)
@Override
public void onKeyMoved(String key, GeoLocation location)
@Override
public void onGeoQueryReady()
@Override
public void onGeoQueryError(DatabaseError error)
);
我的函数 getNearbyRestaurant 没有被调用。我不确定为什么?我试图放置在不同的位置,但没有打电话。希望任何人都可以提供帮助。我正在尝试显示我当前位置附近的附近餐厅列表。我可能错过了一些东西。希望任何人都可以提供帮助,因为在获取附近位置时没有太多资源。我看过更多有关网约车服务的影片
【问题讨论】:
你能检查一下logcat吗? 没有错误。 fetchLastLocation 有效,但其他功能无效 你能在onGeoQueryError()
做一个日志吗?检查是否捕获错误
getNearbyRestaurant() 函数没有被调用,我无法从 onGeoQueryError 获取 logcat
在那个方法里面,有很多代码。尝试逐个检查 1
【参考方案1】:
fetchLastLocation
和 getNearbyRestaurant
都异步加载数据。如果您在调试器中运行代码,或添加一些日志记录,您会看到在 GeoQuery geoQuery = geoFire.queryAtLocation(new GeoLocation(latitude,longitude),radius)
运行时,latitude = mCurrentLocation.getLatitude()
行尚未运行。
从 Firebase 异步加载数据,从 android 操作系统异步检索位置。您的 Android 应用程序的主线程不会等待该数据或位置可用。因此,任何需要位置或数据的代码都需要在相关回调中,或者从那里调用。
最简单的解决方法是从onSuccess
内部调用getNearbyRestaurant
:
Task<Location> task = fusedLocationProviderClient.getLastLocation();
task.addOnSuccessListener(new OnSuccessListener<Location>()
@Override
public void onSuccess(Location location)
if (location != null)
mCurrentLocation = location;
Toast.makeText(getApplicationContext(), mCurrentLocation.getLatitude()
+ "" + mCurrentLocation.getLongitude(), Toast.LENGTH_SHORT).show();
SupportMapFragment supportMapFragment = (SupportMapFragment)
getSupportFragmentManager().findFragmentById(R.id.google_map);
supportMapFragment.getMapAsync(MapActivity.this);
latitude = mCurrentLocation.getLatitude();
longitude = mCurrentLocation.getLongitude();
Log.d(TAG, "The latitude is " + latitude + " and the longitude is " + longitude);
getNearbyRestaurant();
我强烈建议阅读异步 API,因为几乎所有现代云或基于 I/O 的 API 的工作方式都是相同的。
见:
getContactsFromFirebase() method return an empty list,它还展示了如何进行自定义回调,然后您可以将其传递给fetchLastLocation
。
【讨论】:
嗨弗兰克,我试过你的方法,但似乎没有调用 getNearbyRestaurant() 这意味着你是整个onSuccess
没有被调用。不过,交互式调试器通过 Stack Overflow 确实效率低下。最好自己调试代码,在所有行设置断点,然后看看有什么不符合您的预期。以上是关于我的函数 get Nearby Restaurant 未被调用以在 Google Map 上放置标记的主要内容,如果未能解决你的问题,请参考以下文章
使用Nearby Connections API进行音频流式传输
Google nearBy BLE 后台订阅仅适用于事件屏幕