【问题标题】:How to return value from Observable to Rxjava 2如何将值从 Observable 返回到 Rxjava 2
【发布时间】:2020-03-16 11:01:23
【问题描述】:

我遇到了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
    }

在日志中,答案以我需要的格式出现。

该方法位于不是活动或片段的类中。 如何实施我的计划?

【问题讨论】:

  • 将返回类型 String 更改为 Single

标签: java android kotlin rx-java rx-java2


【解决方案1】:
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 的提示

【讨论】:

    【解决方案2】:

    实现此目的的一种简单而简洁的方法是使用接口。

    1. 创建您的界面
        interface AnimalCallbacks {
          fun onAnimalNameReturned(name: String)
        }
    
    1. 让你的类实现接口
        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())
                    }
                )
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-26
      相关资源
      最近更新 更多