我在从后端调用服务后遇到返回值的问题,这是我从服务中获取的字符串,在我调用此服务后我希望该方法返回该字符串
我尝试将其保存在变量中,然后将其保存在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
}
答案 0 :(得分:2)
您只是不了解线程的工作方式。 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使您的代码看起来像您当前的代码,但是我强烈建议您先学习如何使用线程。