Первый метод не успевает отработать

Всем привет! У меня есть метод, который включает в себя 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 шт):

Автор решения: zTrap
.addOnSuccessListener(this, location -> {

Данный кусок кода должен вам намекать на то, что он выполняется асинхронно. Для того чтобы исправить вашу проблему достаточно перенести вызов второго метода в данный колбэк.

Получится примерно так:

меняем сигнатуру метода getPositionDriver на

void getPositionDriver(Runnable action) {

В коллбэке вызываем этот action:

addOnSuccessListener(this, location -> {
                if (location != null) {
                    ...
                    action.run();

И вызываем теперь так:

getPositionDriver(() -> getCoordinationDelivery());
→ Ссылка