Я пытаюсь получить данные из 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() }