Первый метод не успевает отработать
Всем привет! У меня есть метод, который включает в себя 2 метода.
public void searchButton(View view) throws IOException {
getPositionDriver();
getCoordinationDelivery();
}
В первом методе я получаю координаты телефона водителя.
void getPositionDriver() {
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(MainActivity.this,
new String[]{Manifest.permission.ACCESS_FINE_LOCATION},
MY_PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION);
return;
}
// В ЭТОМ МЕСТЕ РАБОТА МЕТОДА ПРИОСТАНАВЛИВАЕТСЯ ПО КАКОЙ-ТО ПРИЧИНЕ
//И ПРОДОЛЖАЕТ СВОЮ РАБОТУ ТОЛЬКО ПОСЛЕ ЗАВЕРШЕНИЯ ВСЕХ ДРУГИХ ПОСЛЕДУЮЩИХ МЕТОДОВ.
fusedLocationClient.getLastLocation()
.addOnSuccessListener(this, location -> {
if (location != null) {
double lat = location.getLatitude();
double lon = location.getLongitude();
position.setLatitudeDriverDouble(lat);
position.setLongitudeDriverDouble(lon);
}
});
}
Во втором методе идет получение координат доставок.
private void getCoordinationDelivery() throws IOException {
for (int i = 0; i < orders.size(); i++) {
String coordinates = YandexMaps.coordinates(orders.get(i).getAddress(), orders.get(i).getIdOrder());
String coordinatesLat = null;
String coordinatesLong = null;
int indexCoordinates = coordinates.indexOf(",");
String start = coordinates.substring(indexCoordinates + 1);
String finish;
try {
finish = coordinates.substring(0, indexCoordinates - 1);
coordinatesLat = start;
coordinatesLong = finish;
positions.add(new Position(orders.get(i).getIdOrder(), orders.get(i).getAddress(), true, coordinatesLat, coordinatesLong));
} catch (Exception e) {
positions.add(new Position(orders.get(i).getIdOrder(), orders.get(i).getAddress(), false, coordinatesLat, coordinatesLong));
}
}
}
Запускается первый метод, не успевает отработать, т.е. координаты водителя я так и не получаю. Запускается второй метод. Только после завершения второго метода, появляются координаты водителя. Там есть еще третий метод, который сравнивает координаты и находит ближайшую точку, но не в этом суть. Оставляя только один метод получения координат водителя, все ок. Я не пойму почему так происходит.
Ответы (1 шт):
.addOnSuccessListener(this, location -> {
Данный кусок кода должен вам намекать на то, что он выполняется асинхронно. Для того чтобы исправить вашу проблему достаточно перенести вызов второго метода в данный колбэк.
Получится примерно так:
меняем сигнатуру метода getPositionDriver на
void getPositionDriver(Runnable action) {
В коллбэке вызываем этот action:
addOnSuccessListener(this, location -> {
if (location != null) {
...
action.run();
И вызываем теперь так:
getPositionDriver(() -> getCoordinationDelivery());