Получить значение метода onResponse в переменную

274
19 сентября 2017, 06:44

Получить значение метода onResponse в переменную.

var GLOBAL_VAR:Int? = null
class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        doInBackground()
    }
    private var urlConnection: HttpURLConnection? = null
    private var reader: BufferedReader? = null
    private var resultJson = ""
    private var url = URL("https://maps.googleapis.com/maps/api/distancematrix/json?units=metric&origins=53.7095281,91.4277445&DC&destinations=53.696365,91.386070&mode=driving&key=AIzaSyCJYCg5StSenKMjLgEn3zAbAAwpuBESKQc")
    private fun doInBackground() {
        // получаем данные с внешнего ресурса
        try {
            urlConnection = url.openConnection() as HttpURLConnection
            urlConnection!!.requestMethod = "GET"
            urlConnection!!.connect()
            val inputStream = urlConnection!!.inputStream
            val buffer = StringBuffer()
            reader = BufferedReader(InputStreamReader(inputStream))
            var line: String?
            do {
                line = reader!!.readLine()
                if (line == null)
                    break
                buffer.append(line)
            } while (true)
            resultJson = buffer.toString()
        } catch (e: Exception) {
            e.printStackTrace()
        }
            val client = OkHttpClient.Builder()
                    .connectTimeout(30, TimeUnit.SECONDS)
                    .readTimeout(30, TimeUnit.SECONDS)
                    .retryOnConnectionFailure(false)
                    .build()
            val request = Request.Builder()
                    .url(url)
                    .build()
            client.newCall(request).enqueue(object : Callback {
                override fun onResponse(call: Call, response: Response?){
                    val responseString = response!!.body()!!.string()
                    val resultJson = JSONObject(responseString)
                    val rows = resultJson.getJSONArray("rows")
                    val obj = rows.getJSONObject(0)
                    val elements = obj.getJSONArray("elements")
                    val element = elements.getJSONObject(0)
                    val distance = element.getJSONObject("distance")
                    var value = distance.getInt("value")
                    value /= 1000
                    Log.d(LOG_TAG, value.toString())
                }
                override fun onFailure(call: Call?, e: IOException?) {
                    Log.d(LOG_TAG, "some error")
                }
            })
    }
    companion object {
        var LOG_TAG = ">>>>>>>>>>>>>>>>>>>>>>>>LOG>>>>>>>>>>>>>>>>>>>>>>>>"
    }
}
Answer 1

В Android нельзя синхронно выполнять запросы к сети, да и зачем? Иначе юзеру пришлось бы смотреть на зависнувшее UI и ждать выполнения каждого вашего запроса. Последуйте следующей логике: вы хотите сделать запрос к сети и сохранить потом что-то в переменную, - в этом состоит ваш вопрос, верно?

Тогда почему бы не построить эту логику по-другому: просто сразу вызывайте нужную вам логику, при получении нужного ответа. Допустим, вы хотите сделать запрос к API какого-то сайта и просто напрямую поместить ответ от сервера в какой-нибудь TextView - тогда просто делайте запрос к этому API, получайте нужный ответ и передавайте его в метод, который будет содержать вашу логику (например, как я сказал - устанавливать ответ в виде текста на экране).

В котлине есть, например, корутины, или же можно обычным AsynkTask добиться того, чего вы хотите (поместить синхронно данные в переменную) - но зачем?

READ ALSO
AssetManager долго грузит звук

AssetManager долго грузит звук

Пытаюсь загрузить 'bangogg' из папки assets с помощью AssetManager:

278
Запуск тестов автоматически

Запуск тестов автоматически

Есть виртуалка для прокрутки тестов

235
JavaFX. Проблема в передаче элемента в функцию

JavaFX. Проблема в передаче элемента в функцию

Доброго времени суток! Имеется следующий код:

228
Авторизация в Bitrix

Авторизация в Bitrix

Возможно ли авторизовываться в битриксе, допустим, из Java или JS c помощью веб-сервисов? Если нет, то есть какие-нибудь иные способы сделать это?

230