Возвращает строку из метода после вызова RxJava - PullRequest
0 голосов
/ 03 июня 2019

У меня проблема с возвратом значения после того, как я вызываю Службу из Бэкэнда, это Строка, которую я получаю от Службы, и после того, как я вызываю эту Службу, я хочу, чтобы этот метод возвратил мне эту строку

Я попытался сохранить его в переменной, сохранив его в sharedpreference, но он всегда возвращает мне пустую строку.Тем не менее, когда я регистрирую результат, полученный от службы, я вижу, что он возвращает мне то, что я хочу, но я хочу, чтобы метод затем возвращал мне этот результат

    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
    }

1 Ответ

2 голосов
/ 03 июня 2019

Вы просто не поняли, как работают нити. 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. Я желаю, чтобы вы могли сделать это самостоятельно.

Конечно, вы можете использовать сопрограммы , чтобы ваш код выглядел как ваш текущий, но я настоятельно рекомендую вам сначала научиться работать с потоками.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...