Вызов API и сопрограммы - PullRequest
0 голосов
/ 09 мая 2019

У меня проблема с Kotlin и сопрограммами.Я написал этот метод для вызова API и получить некоторую информацию от этого.Я называю CalculateDistance, который вычисляет расстояния для меня в км.У меня проблема в том, что пользовательский интерфейс загружается до завершения этого метода.Я пытался обойти это, используя сопрограммы, однако, похоже, застрял.

Эта функция, возвращенная String, затем используется для рендеринга в Activity.

Спасибо

    private fun getPostcodeLocation(listOfPostCodes: List<Pair<Boolean, String>>): String {
        val jsonList = JSONObject()
        jsonList.put("postcodes", JSONArray(listOfPostCodes.map { it.second}))
        val body = RequestBody.create(MediaType.parse("application/json; charset=utf-8"), jsonList.toString())
        val request = okhttp3.Request.Builder().url("https://api.postcodes.io/postcodes" ).post(body).build()
        val client = OkHttpClient()
        client.newCall(request).enqueue(object: Callback {
            override fun onResponse(call: Call, response: Response) {
                val responseBody = response.body()?.string()
                val jsonTree = JsonParser().parse(responseBody).asJsonObject
                val resultJsonObj = jsonTree.asJsonObject.getAsJsonArray("result").asJsonArray.iterator()
                resultJsonObj.forEach {
                    val resultObject = Gson().toJsonTree(it).asJsonObject.getAsJsonObject("result")
                    val lat = resultObject.get("latitude").asDouble
                    val lon = resultObject.get("longitude").asDouble
                    listOfLonLat.add(PostcodeLongLat(lon, lat))
                }
                distance =  calculateDistance(listOfLonLat)
                Log.d("PostCodeChecker", "This is the distance inside the callback $distance")
            }

            override fun onFailure(call: Call, e: IOException) {
                println(call)
                println(e)
                Log.d("PostCodeChecker", "Failed to get the information from the API")
                distance = "Not Available"
            }
        })
        Log.d("PostCodeChecker", "This is the distance $distance")
        return distance
    }

Ожидается строка, представляющая расстояние между двумя точками long / lat на карте, получите Null.

1 Ответ

0 голосов
/ 15 мая 2019

это не похоже на вопрос, связанный с сопрограммами. Ваш вызов API происходит асинхронно, поэтому вы не можете ожидать получения результата до возвращения расстояния. Что вы можете сделать, так это получить доступ к нужному элементу пользовательского интерфейса в методе onResponse. Э.Г.

override fun onResponse(call: Call, response: Response) {
               //parsing, calculations etc.
                yourTextView.text = distance.toString
            }
...