не сохраняются данные в переменную в методе subscribe() RxJava

Всем привет. Не могу понять почему в теле метода subscrube() я присваиваю значение переменной coordinates,и сразу же вывожу значение переменной coordinates в Log и мне отображает нужный мне результат результат, но когда я возвращаю значение переменной coordinates из метода getCoordinates() то возвращает пустую строку. За ранее благодарю за помощь.

private val coordinates = ""

private fun getCoordinates(): String? {
        getLastDeviceLocation()
            ?.subscribeOn(Schedulers.io())
            ?.observeOn(AndroidSchedulers.mainThread())
            ?.subscribe({
                coordinates = "${it.latitude}, ${it.longitude}"
                Log.i("mLog", coordinates)//  выводит нужные мне координаты
            },
                { Log.i("ERROR", "error = ${it.localizedMessage}") }
            )
        return coordinates // Возвращает пустую строку 
       }

Ответы (1 шт):

Автор решения: Спицко Дмитрий

Все логично. Вы внутри метода getCoordinates подписываетесь на событие "Получены новые координаты". Еще и слушаете в главном потоке. У вас нулевая вероятность, что наблюдатель сработает в этот кадр. И у вас сначала отрабатывает метод getCoordines, в котором создается подписка и возвращается пустая еще строка. Через некоторое время наблюдатель получит новые координаты и запишет в вашу переменную, но метод geCoordinates уже давно выполнится.

Вам однозначно не стоит оставлять метод в таком виде. У вас должен быть один метод, который создает подписку и вызывается только один раз, и другой, в котором вы получаете то, что хранится в переменной coordinates, с учетом того что там могло еще ничего не прийти

PS Еще почитайте про disposable. Сейчас вы создаете с каждым вызовом getCoordinates новую подписку, а старые никуда не деваются, у вас утечка памяти

→ Ссылка