kotlin 无法从URL获取文本

jgwigjjp  于 2023-01-31  发布在  Kotlin
关注(0)|答案(1)|浏览(123)

我觉得我的问题很简单,但是我刚开始在android上的路,所以现在是个大问题,反正我想从url读取文本,转换成数组,显示成ListView。
下面是我的部分代码:

private fun getSongList() {
        Executors.newSingleThreadExecutor().execute() {
            val songList =
                URL("https://vivalaresistance.ru/radio/stuff/vlrradiobot.php?type=getPlaylist").readText(
                    Charset.forName("windows-1251")
                )
                    .replace("й", "й")
                    .replace("Й", "Й")
                    .split("\n").toTypedArray()
        }
            val list = view?.findViewById<ListView>(R.id.list)
            val arrayAdapter =
                ArrayAdapter(requireActivity(), android.R.layout.simple_list_item_1, songList)
            list?.adapter = arrayAdapter
    }

我想问题出在声明值上。
我该做些什么改变才能让整件事成功呢?

cotxawn7

cotxawn71#

您的代码存在以下几个问题:

  • 实际上并不调用url,只是定义它而不打开与HttpUrlConnection的连接
  • 您正在后台线程Executors.newSingleThreadExecutor().execute()中更新UI代码,应始终在UI线程上更新UI
  • 这只是优化,但您最好使用RecylerView而不是ListView,使用dataBinding而不是view reference,并且不应将UI代码和后台代码放在同一个类中

因此,使用匿名asyncTask实现函数的正确方法是:

private fun getSongList() {
        val task = object : AsyncTask<Void, Void, Array<String>>() {
            override fun doInBackground(vararg params: Void): Array<String> {
                val url = URL("https://vivalaresistance.ru/radio/stuff/vlrradiobot.php?type=getPlaylist")
                val connection = url.openConnection() as HttpURLConnection
                connection.requestMethod = "GET"
                connection.connect()
    
                val songList = BufferedReader(InputStreamReader(connection.inputStream))
                    
    
                connection.disconnect()
                return songList
                    .readText()
                    .replace("и&#774;", "й")
                    .replace("И&#774;", "Й")
                    .split("\n").toTypedArray()
            }
    
            override fun onPostExecute(result: Array<String>) {
                val list = view?.findViewById<ListView>(R.id.list)
                val arrayAdapter = ArrayAdapter(requireActivity(), android.R.layout.simple_list_item_1,result)
                list?.adapter = arrayAdapter
            }
        }
        task.execute()
    }

假设您要对结果而不是url本身执行split/replace操作

相关问题