java - Android 中的 Asynctask 多个连续 URL 请求

标签 java android android-asynctask httprequest kotlin

我在请求多个连续的 url http 请求时遇到问题。我的应用程序没有崩溃。在这段代码中使用 loadUrls() 函数时,它连续执行 6 个 url 请求并将它们存储在一个数组中,但是我只能看到请求的第一个字符串响应。

fun loadUrls(){
val locationInput = “AsiaWorldExpo”
val locationCoordinatesLong = 113.947
val locationCoordinatesLat = 22.2913
val myAPIKey = "REMOVED"
val transportMode = arrayListOf("&mode=driving" ,"&mode=walking", "&mode=bicycling",
        "&mode=transit&transit_mode=bus", "mode=transit&transit_mode=subway", "mode=transit&transit_mode=train")

var requestURLArray = ArrayList<String>()
for (i in 0 until transportMode.size) {

  requestURLArray.add("https://maps.googleapis.com/maps/api/distancematrix/json?units=metric&origins= " +
            "$locationCoordinatesLat,$locationCoordinatesLong &destinations=$locationInput ${transportMode[i]} &key= $myAPIKey")
}
MyAsyncTask().execute(requestURLArray[0],requestURLArray[1],requestURLArray[2]
        ,requestURLArray[3], requestURLArray[4], requestURLArray[5])
}

override fun doInBackground(vararg p0: String?): String { 
        try {
            val inString = ArrayList<String>()
            for (i in 0 until p0.size) {
                val url = URL(p0[i])

                val urlConnect = url.openConnection() as HttpURLConnection
                urlConnect.connectTimeout = 7000
                inString.add(ConvertStreamToString(urlConnect.inputStream)) 
                publishProgress(inString[i])
                Log.d("APP_TEST", "" + p0[i]) //Added for debugging
                try {
                    Thread.sleep(500)
                } catch (e: InterruptedException) {}
            }
        }catch (r:Exception){}

        return " "
    }

override fun onProgressUpdate(vararg values: String?) {
    try{
        val jsonObject = ArrayList<String>()
        for (i in 0 until values.size){

            jsonObject.add(values[i]!!)
            Log.d("Testing", "" + values[i]) //Added for debugging

        }
        idTextView2.text =  jsonObject[1] 

EDIT: The above line of code does not print out the Text View to UI from jsonObject[1] up to jsonObject[5]. Only jsonObject[0] works.

    }catch (e:Exception){}
}
override fun onPostExecute(result: String?) {
}
}
    fun ConvertStreamToString(inputStream: InputStream): String{
    val bufferReader = BufferedReader(InputStreamReader(inputStream))
    var line =""
    var allString=""
    try{
        do{
            line=bufferReader.readLine()
            if (line!=null){
                allString+=line
            }
        } while (line!=null)
        inputStream.close()
    } catch (e:Exception){}
    return allString
}

这是更新后的 Logcat:

08-18 09:51:21.697 2660-3883/com.google.android.gms W/DriveInitializer: Background init thread ended

08-18 09:52:00.405 1369-1409/? W/audio_hw_generic: Not supplying enough data to HAL, expected position 772788 , only wrote 772560

08-18 09:52:00.433 3297-3320/com.companyname.emitless2 D/EGL_emulation: eglMakeCurrent: 0x7ebacc5cc6e0: ver 2 0 (tinfo 0x7ebadbdb9d00)

08-18 09:52:00.441 3297-3320/com.companyname.emitless2 D/EGL_emulation: eglMakeCurrent: 0x7ebacc5cc6e0: ver 2 0 (tinfo 0x7ebadbdb9d00)

08-18 09:52:00.590 3297-3894/com.companyname.emitless2 D/APP_TEST: https://maps.googleapis.com/maps/api/distancematrix/json?units=metric&origins= 22.29129833333333,113.94699999999999 &destinations=AsiaWorldExpo &mode=driving &key= "REMOVED"

08-18 09:52:00.590 3297-3297/com.companyname.emitless2 D/Testing: { "destination_addresses" : [ "Cheong Wing Rd, Chek Lap Kok, Hong Kong" ], "origin_addresses" : [ "Yi Tung Rd, Tung Chung, Hong Kong" ], "rows" : [ { "elements" : [ { "distance" : { "text" : "5.9 km", "value" : 5948 }, "duration" : { "text" : "9 mins", "value" : 541 }, "status" : "OK" } ] } ], "status" : "OK"}

08-18 09:52:01.286 3297-3894/com.companyname.emitless2 D/APP_TEST: https://maps.googleapis.com/maps/api/distancematrix/json?units=metric&origins= 22.29129833333333,113.94699999999999 &destinations=AsiaWorldExpo &mode=walking &key= "REMOVED"

08-18 09:52:01.287 3297-3297/com.companyname.emitless2 D/Testing: { "destination_addresses" : [ "Cheong Wing Rd, Chek Lap Kok, Hong Kong" ], "origin_addresses" : [ "Yi Tung Rd, Tung Chung, Hong Kong" ], "rows" : [ { "elements" : [ { "distance" : { "text" : "5.9 km", "value" : 5948 }, "duration" : { "text" : "9 mins", "value" : 541 }, "status" : "OK" } ] } ], "status" : "OK"}

08-18 09:52:01.865 3297-3894/com.companyname.emitless2 D/APP_TEST: https://maps.googleapis.com/maps/api/distancematrix/json?units=metric&origins= 22.29129833333333,113.94699999999999 &destinations=AsiaWorldExpo &mode=bicycling &key= "REMOVED"

08-18 09:52:01.865 3297-3297/com.companyname.emitless2 D/Testing: { "destination_addresses" : [ "Cheong Wing Rd, Chek Lap Kok, Hong Kong" ], "origin_addresses" : [ "Yi Tung Rd, Tung Chung, Hong Kong" ], "rows" : [ { "elements" : [ { "distance" : { "text" : "5.9 km", "value" : 5948 }, "duration" : { "text" : "9 mins", "value" : 541 }, "status" : "OK" } ] } ], "status" : "OK"}

08-18 09:52:02.409 1672-1672/system_process W/WindowManager: Attempted to remove non-existing token: android.os.Binder@7d40824

08-18 09:52:02.495 3297-3320/com.companyname.emitless2 D/EGL_emulation: eglMakeCurrent: 0x7ebacc5cc6e0: ver 2 0 (tinfo 0x7ebadbdb9d00)

08-18 09:52:02.540 3297-3320/com.companyname.emitless2 D/EGL_emulation: eglMakeCurrent: 0x7ebacc5cc6e0: ver 2 0 (tinfo 0x7ebadbdb9d00)

08-18 09:52:03.632 1369-1410/? W/audio_hw_generic: Not supplying enough data to HAL, expected position 1080247 , only wrote 927360

08-18 09:52:04.458 1672-1672/system_process W/WindowManager: Attempted to remove non-existing token: android.os.Binder@f7c5953

最佳答案

您将在每次迭代中创建名为 inString、类型为 ArrayList 的新实例。因此,当您创建新实例并向其中添加一个项目时,该项目始终为 0。通过将 arrayList 实例创建移到循环之外来修复它。

override fun doInBackground(vararg p0: String?): String { 
 try {
    val inString = ArrayList<String>()
    for (i in 0 until p0.size) {
        val url = URL(p0[i]) 
        val urlConnect = url.openConnection() as HttpURLConnection
        urlConnect.connectTimeout = 7000          
        inString.add(ConvertStreamToString(urlConnect.inputStream)) 
        publishProgress(inString[i])
        try {
            Thread.sleep(500)
        } catch (e: InterruptedException) {}
    }
}catch (e:Exception){}
return " "
}

关于java - Android 中的 Asynctask 多个连续 URL 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45730622/

相关文章:

Android AsyncTask 上下文行为

java - 如何在 AsyncTask 完成之前更新 ListView

java - Spring Boot 自动配置顺序

android - FCM 服务器实现

Android:如何设置状态栏和导航栏半透明

java - 何时使用 "new"关键字 android API

java - 分配布局时出错 : BoxLayout can't be shared

java - JDI - IllegalConnectorArgumentsException : Argument invalid

Android:GridView Adapter 需要使用异步任务下载和显示图像 - 太慢了

java - Android 资源 : SQLiteDatabase Missing databases/***. 资源或目标文件夹中的 zip 文件不可写