Android与Kotlin – 如何使用HttpUrlConnection

我试图从一个AsyncTask的url中获取数据,但是在创建HttpUrlConnection的新实例时出现HttpUrlConnection

在Java上是这样的

 URL url = new URL("http://www.android.com/"); HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); try { InputStream in = new BufferedInputStream(urlConnection.getInputStream()); readStream(in); finally { urlConnection.disconnect(); } 

但我不断收到如下所示的错误。

 class GetWeatherTask : AsyncTast<Void, Void, Void>() { override fun doInBackground(vararg params: Void?): Void? { val httpClient = HttpURLConnection(); return null } override fun onPreExecute() { super.onPreExecute() } override fun onPostExecute(result: Void?) { super.onPostExecute(result) } } 

无法访问'':'HttpURLConnection'中的'protected / protected和package /'无法创建抽象类的实例

我错过了什么吗? 我尝试创建一个扩展HttpUrlConnection的类对象,并试图实现init方法,但我不能

提前致谢。

这是一个问题和答案的简化。

为什么这会失败?

 val connection = HttpURLConnection() val data = connection.inputStream.bufferedReader().readText() // ... do something with "data" 

错误:

Kotlin:无法访问'':'HttpURLConnection'中的'protected / protected和package /'

这是失败的,因为你正在构建一个不打算直接构造的类。 它是由工厂创建的,该工厂位于URLopenConnection()方法中。 这也不是原始问题中示例Java代码的直接端口。

Kotlin打开这个连接并以字符串读取内容的最习惯的方法是:

 val connection = URL("http://www.android.com/").openConnection() as HttpURLConnection val data = connection.inputStream.bufferedReader().readText() 

完成阅读文本或发生异常时,此表单将自动关闭所有内容。 如果你想做自定义阅读:

 val connection = URL("http://www.android.com/").openConnection() as HttpURLConnection connection.inputStream.bufferedReader().use { reader -> // ... do something with the reader } 

注意: use()扩展函数将打开并关闭阅读器,并自动处理错误。

关于disconnect()方法

disconnect的文档说:

每个HttpURLConnection实例用于发出一个请求,但与HTTP服务器的底层网络连接可能被其他实例透明地共享。 在请求后,在HttpURLConnection的InputStream或OutputStream上调用close()方法可以释放与此实例关联的网络资源,但对任何共享的持久连接都没有影响。 如果此时持久连接处于空闲状态,调用disconnect()方法可能会关闭底层套接字。

所以你决定是否打电话给你。 以下是调用断开连接的代码的一个版本:

 val connection = URL("http://www.android.com/").openConnection() as HttpURLConnection try { val data = connection.inputStream.bufferedReader().readText() // ... do something with "data" } finally { connection.disconnect() }