Как вернуть значение из 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())
}
)