И fetchLastLocation
, и getNearbyRestaurant
загружают данные асинхронно. Если вы запустите код в отладчике или добавите несколько журналов, вы увидите, что к моменту запуска GeoQuery geoQuery = geoFire.queryAtLocation(new GeoLocation(latitude,longitude),radius)
строки latitude = mCurrentLocation.getLatitude()
еще не запускаются.
Данные загружаются из Firebase асинхронно и местоположения извлекаются из ОС Android асинхронно. Основная ветка вашего Android приложения не ждет, когда эти данные или местоположение станут доступными. По этой причине любой код, которому требуется местоположение или данные, должен находиться внутри соответствующего обратного вызова или вызываться оттуда.
Самое простое решение - вызвать getNearbyRestaurant
из onSuccess
:
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, так как это работает практически для любого современного API на основе облака или ввода-вывода.
См .: