AsyncTask onPostExecute 在 JSONObject 后停止执行

AsyncTask onPostExecute stops executing after JSONObject

美好的一天!

我正在使用 Google 地图,使用他们的 SDK 和 APIs(地点 API 等)。我遇到的问题是,当代码到达 val parentObject = JSONObject(result) 时,它停止执行下面的行。我调试了它并看到,我传递的 URL 和地图没问题,而且我已经检查了 Android Studio 外的 URL 没问题,它给了我一个数组的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) {
        }
    }
}

非常感谢您的帮助!

在 google 放置 Api 响应中没有包含 "candidates" 键的 json 数组,请确保正确反序列化响应,

所以我重做了这个 class 制作了一个新的 (PlacesAPI) 来分离 AsyncTask 和 HTTP 连接。此外,我向新实例添加了更多内容,例如 requestMethodbufferReader 等。我没有使用 class 的新实例(我用它来传递数据),而是制作了我需要在其他 classes 中使用的方法的参数。有一个新的代码class:

    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
        }
    }
}

而且成功了!现在它向我展示了我需要的一切!感谢大家的帮助。