Android с Kotlin – Как использовать HttpUrlConnection

Я пытаюсь получить данные из url внутри AsyncTask но я получаю сообщение об ошибке при создании нового экземпляра 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) } } 

Не удается получить доступ к '': он защищен / защищен и package / 'в' HttpURLConnection 'Невозможно создать экземпляр абстрактного класса

Я что-то упускаю? Я попытался создать объект класса, расширяющий HttpUrlConnection и попытаюсь реализовать метод init но я не мог

Заранее спасибо.

Вот упрощение вопроса и ответа.

Почему это не удается?

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

с ошибкой:

Kotlin: невозможно получить доступ к '': он защищен / защищен и package / 'в' HttpURLConnection '

Это терпит неудачу, потому что вы строите класс, который не предназначен для прямого построения. Он предназначен для создания на заводе, который находится в openConnection() класса URL . Это также не прямой порт образца кода Java в исходном вопросе.

Самый идиоматический способ в Котлине открыть это соединение и прочитать содержимое в виде строки:

 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-серверу может быть прозрачно распространено другими экземплярами. Вызов методов close () в InputStream или OutputStream HttpURLConnection после запроса может освобождать сетевые ресурсы, связанные с этим экземпляром, но не влияет на какое-либо совместное постоянное соединение. Вызов метода disconnect () может закрыть базовый сокет, если в то время постоянное соединение неактивно.

Поэтому вы решаете, хотите ли вы это назвать или нет. Вот версия кода, который вызывает 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() }