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 /'
这是失败的,因为你正在构建一个不打算直接构造的类。 它是由工厂创建的,该工厂位于URL
类openConnection()
方法中。 这也不是原始问题中示例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() }
- RetrlerView itemClickListener在Kotlin中
- LifecycleObserver不起作用
- 在创建gradle插件时,把生成的java或kotlin源放到哪里?
- 如何获取Android Path字符串到资产文件夹上的文件?
- Android单击时更改背景颜色
- 如何解释这个怪异的行为,当以编程方式将边距设置为RelativeLayout中的视图?
- 只有在RecycleView / List大于屏幕的情况下,才能使用setStackFromEnd
- 在kotlin中,如何传递一个MutableList,其中目标需要一个List
- 调用Rooms inMemoryBuilder方法时,Room Persistence Library运行时exception