AsyncTask onPostExecute прекращает выполнение после JSONObject - PullRequest
0 голосов
/ 25 марта 2020

Добрый день!

Я работаю с Google Maps, используя их SDK и API (Place API, et c.). Я столкнулся с проблемой, что, когда код достигает val parentObject = JSONObject(result), он прекращает выполнение строк ниже. Я отладил его и увидел, что URL и Карты, которые я передаю, в порядке, также я уже проверил URL за пределами Android Studio и все в порядке, он дает мне массив JSON. Я не понимаю, почему это просто останавливается на этой линии. Код AsyncTask ниже:

class MapsAsyncTasks : AsyncTask<Any, String, String>() {

    companion object {
        private lateinit var map: GoogleMap
        private lateinit var url: String

        fun dataTransfer(map: GoogleMap, url: String): MapsAsyncTasks {
            val asyncTasks = MapsAsyncTasks()
            this.map = map
            this.url = url
            return asyncTasks
        }
    }

    override fun doInBackground(vararg params: Any?): String? {
        try {
            val mUrl = URL(url)
            val httpURLConnection = mUrl.openConnection() as HttpURLConnection
            httpURLConnection.connect()

        } catch (e: MalformedURLException) {
        } catch (e: IOException) {
        }

        return url
    }

    override fun onPostExecute(result: String?) {
        super.onPostExecute(result)

        try {
            if(result != null) {
                //It comes here
                val parentObject = JSONObject(result) //It do this line

                val resultsArray = parentObject.getJSONArray("candidates") //It does not executing this and other lines below

                for (i in 0 until resultsArray.length()) {
                    val jsonObject = resultsArray.getJSONObject(i)
                    val locationObject = jsonObject.getJSONObject("geometry").getJSONObject("location")

                    val latitude = locationObject.getString("lat").toDouble()
                    val longitude = locationObject.getString("lng").toDouble()

                    val nameObject = resultsArray.getJSONObject(i)
                    val name = nameObject.getString("name")
                    val latLng = LatLng(latitude, longitude)
                    val markerOptions = MarkerOptions()
                    markerOptions.title(name)
                    markerOptions.position(latLng)

                    map.addMarker(markerOptions)
                }
            }
        } catch (e: JSONException) {
        }
    }
}

Большое спасибо за помощь!

Ответы [ 2 ]

0 голосов
/ 26 марта 2020

Поэтому я переделал этот класс, создав новый (PlacesAPI) для разделения AsyncTask и HTTP-соединения. Кроме того, я добавил еще кое-что, например, requestMethod, bufferReader и др. 1012 *. Вместо нового экземпляра класса (я использовал его для передачи данных) я задал параметры методов, которые мне нужно было использовать в других классах. Есть код нового класса:

    class PlacesAPIs {

    lateinit var result: String

    fun getPlacesJSON(c: Context,
                      lat: Double,
                      lng: Double,
                      keyword: String,
                      type: String,
                      radius: Int,
                      language: String
    ): String {
        try {
            val key = c.resources.getString(R.string.google_maps_key)

            val urlString = "https://maps.googleapis.com/maps/api/place/nearbysearch/json?keyword=$keyword&type=$type&location=$lat,$lng&radius=$radius&language=$language&key=$key"
            val url = URL(urlString)
            val httpURLConnection = url.openConnection() as HttpURLConnection
            httpURLConnection.setRequestProperty("Content-Type", "application/json")
            httpURLConnection.requestMethod = "GET"
            httpURLConnection.doInput = true

            val br = httpURLConnection.inputStream.bufferedReader()
            result = br.use { br.readText() }
            httpURLConnection.disconnect()
        } catch (e: Exception) {
            Log.e("Places API:", "the APIM didn't get JSON")
        }
        return result
    }
}

И сейчас мой AsyncTask выглядит так:

class MapsAsyncTasks(var c: Context, var lat: Double, var lng: Double, 
                     var keyword: String, var type: String, var radius: Int, 
                     var language: String, var map: GoogleMap) : AsyncTask<Any, String, String>() {

    override fun doInBackground(vararg params: Any?): String? {
        return PlacesAPIs().getPlacesJSON(c, lat, lng, keyword, type, radius, language)
    }

    override fun onPostExecute(result: String?) {
        super.onPostExecute(result)

        try {
            if(result != null) {

                val parentObject = JSONObject(result)
                Log.i("ParentObject:",parentObject.toString())
                val resultsArray = parentObject.getJSONArray("results")

                for (i in 0 until resultsArray.length()) {
                    val jsonObject = resultsArray.getJSONObject(i)
                    val locationObject = jsonObject.getJSONObject("geometry").getJSONObject("location")

                    val latitude = locationObject.getString("lat").toDouble()
                    val longitude = locationObject.getString("lng").toDouble()
                    val name = jsonObject.getString("name")
                    val vicinity = jsonObject.getString("vicinity")
                    val latLng = LatLng(latitude, longitude)

                    val markerOptions = MarkerOptions()
                    markerOptions.title(name)
                    markerOptions.position(latLng)
                    markerOptions.snippet(
                            vicinity
                    )
                    map.addMarker(markerOptions)
                }
            }
        } catch (e: JSONException) {
            //cathing error here
        }
    }
}

И это сработало! Прямо сейчас это показывает мне все, что мне нужно! Спасибо всем за помощь.

0 голосов
/ 25 марта 2020

В ответе Google Place Api отсутствует массив json с ключом "кандидатов". Убедитесь, что вы правильно десериализовали ответ,

...