Как вернуть значение из наблюдаемого в Rx java 2 - PullRequest
0 голосов
/ 16 марта 2020

Я столкнулся с проблемой, что 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
    }

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

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

Ответы [ 2 ]

0 голосов
/ 16 марта 2020

Простой и понятный способ добиться этого - использовать интерфейс.

  1. Создать свой интерфейс
    interface AnimalCallbacks {
      fun onAnimalNameReturned(name: String)
    }
Пусть ваш класс реализует интерфейс
    class MyAnimal: AnimalCallbacks {

            override fun onAnimalNameReturned(name: String) {
                //handle logic here
            }
        }

Отсюда вы можете передать свой интерфейс в вызове метода и отправить результат обратно, используя метод, который вы определили в интерфейсе.

 fun getNameAnimal(name : String, callbacks: AnimalCallbacks) {
        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
                    callbacks.onAnimalNameReturned(animal.name)
                },
                { error ->
                    Log.e(LOG, error.printStackTrace())
                }
            )
    }
0 голосов
/ 16 марта 2020
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) 
             //todo
       },
       { error ->
             Log.e(LOG, error.printStackTrace())
       }
   )

Спасибо за подсказку Alex_Skvortsov

...