AsyncTask onPostExecute在JSONObject之后停止执行

问题描述 投票:0回答:2

美好的一天!

我正在使用他们的SDK和API(Place API等)来处理Google Maps。我遇到的问题是,当代码到达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) {
        }
    }
}

非常感谢您的帮助!

android kotlin android-asynctask google-places-api
2个回答
0
投票

[Google Place Api响应中没有带“ candidates”键的json数组,请确保您正确反序列化了该响应,


0
投票

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

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

而且有效!现在,它向我显示了我需要的一切!感谢大家的帮助。

© www.soinside.com 2019 - 2024. All rights reserved.