Как вернуть значение из Observable в Rxjava 2

Я столкнулся с проблемой, что onNext не может содержать return, но мне нужно вернуть строку. Запрос сделан с помощью Retrofit с фабрикой внутри интерфейса (ApiService).

    fun getNameAnimal(name : String) : String {
       var nameAnimal = " "

       val api = ApiService.create()

       api.getAnimal("Cat")
       .subscribeOn(Schedulers.io())
       .observeOn(AndroidSchedulers.mainThread())
       .subscribe(
           { animal -> 
                 // It works
                 Log.i(LOG, animal.name) 
                 // It NOT works (empty value)
                 nameAnimal = animal.name
           },
           { error ->
                 Log.e(LOG, error.printStackTrace())
           }
       )
       return nameAnimal
    }

В логах ответ приходит в нужном мне формате.

Метод находится в классе, который не является активити или фрагментом. Как я могу реализовать свой план?


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

Автор решения: Alex_Skvortsov

Вы, вероятно, не до конца понимаете принципы работы Rx.

Строка return nameAnimal у Вас выполняется раньше, чем происходит присвоение в функции subscribe, именно поэтому вы не получаете значение.

Ваш код можно переписать следующим способом:

1) Там же, где этот код был раньше (назовем этот класс ApiWorkingClass).

fun getNameAnimal(name : String) : Single<String> {
   val api = ApiService.create()

   return api.getAnimal("Cat")
   .map { animal -> animal.name }
   .subscribeOn(Schedulers.io())
   .observeOn(AndroidSchedulers.mainThread())
}

2) В Вашем фрагменте / активити.

apiWorkingClassInstance.getNameAnimal()
    .subscribe(
       { animalName -> 
             Log.i(LOG, animalName) 
             //здесь делаете, то что нужно сделать с названием животного (например, вывод в TextView)
       },
       { error ->
             Log.e(LOG, error.printStackTrace())
       }
   )
→ Ссылка