【问题标题】:Return String from a Method after RxJava call在 RxJava 调用后从方法返回字符串
【发布时间】:2019-06-03 09:38:57
【问题描述】:

我在从后端调用服务后返回值时遇到问题,它是我从服务获取的字符串,在我调用此服务后,我希望该方法返回该字符串

我尝试将它保存在一个变量中,将它保存在 sharedpreference 中,但它总是返回一个空字符串。然而,当我 Log.d 从服务中获得的结果时,我可以看到它返回了我想要的东西,但我希望方法然后返回结果

    fun getExchangePortalToken(): String {
//I want this variable to be the value of the String i get from the Service and to return it afterwards
        var token = ""
        compositeDisposable!!.add(apiServicePortal!!.getExchangeToken(basic, "casopenid-bearer", idToken)
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribeWith(object: DisposableSingleObserver<Response<ResponseBody>>(){
                    override fun onSuccess(value: Response<ResponseBody>?) {
                        Log.d("EXCHANGE_PORTAL", "SUCCESS")

                        val string = value!!.body()!!.string()
                        val obj = JSONObject(string)
                        var access_token = obj.getString("access_token")

//Here im setting the value of the string based on the Result i get from the service
                        token = access_token
                    }

                    override fun onError(e: Throwable?) {
                        Log.d("EXCHANGE_PORTAL", e!!.message)
                        token = "ERROR"
                    }

                }))
        return token
    }

【问题讨论】:

  • 您期望 Async 调用的返回值。如果您想为其他服务调用交换令牌,您可以将该服务调用与getExchangeToken 调用链接。 getExchangeToken().flatMap{ (token) -&gt; callSomeOtherService(token) }

标签: java android kotlin


【解决方案1】:

您只是没有了解线程的工作原理。 Rx 启动新线程(因为您调用了subscribeOn(Schedulers.io())),然后return token 代码与您的请求并行执行。这意味着在getExchangePortalToken结束的那一刻,你的请求才刚刚开始处理。

如果你想用getExchangePortalToken 得到结果,你可以输入回调参数:

fun getExchangePortalToken(onSuccess: (String) -> Unit): Unit {//now it doesn't return anything

然后在onSuccess的末尾调用:

override fun onSuccess(value: Response<ResponseBody>?) {
    ...
    var access_token = obj.getString("access_token")
    onSuccess(access_token)
}

放置类似的回调来处理错误并在onError 中调用它会很有用。我希望你能自己做。

当然,您可以使用coroutines 使您的代码看起来像您当前的代码,但我强烈建议您先学习如何使用线程。

【讨论】:

    猜你喜欢
    • 2011-03-12
    • 2016-05-19
    • 1970-01-01
    • 2016-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    • 1970-01-01
    相关资源
    最近更新 更多