Как установить connectTimeout в случае медленного inte rnet и если я не знаю размер файла для загрузки - PullRequest
0 голосов
/ 07 января 2020
private fun downloadAPKStream() : InputStream? {

        val url = URL(this.url)

        val connection = url.openConnection() as HttpURLConnection
        connection.requestMethod = "GET"
        connection.connect()            connection.connectTimeout = 5000

        fileSize = connection.contentLength

        val inputStream = connection.inputStream
        return inputStream
    }

Я использую этот метод для загрузки файла apk. Но здесь, если inte rnet медленный, то из-за тайм-аута 5000 мс, загрузка застревает без завершения. И если я комментирую эту строку или не предоставляю ** connection.connectTimeout, тогда он работает нормально, но иногда застревает в бесконечном времени l oop. Что я должен сделать, чтобы он загружал файлы любого размера, а также с медленным inte rnet.

1 Ответ

2 голосов
/ 07 января 2020

Вы получили timeout, что означает неправильно. Это не макс. допустимое время данной (сетевой в данном случае) операции, но макс. допустимое время бездействия , после которого операция считается остановленной и не выполненной. Поэтому вы должны установить таймаут на значение вменяемое , которое имело бы смысл в реальной жизни. Так как значение в миллисекундах , 5000 - это не единственное, потому что это всего лишь 5 секунд - любой небольшой сбой в сети, и ваше соединение будет ограничено. Установите его на что-то выше, например, 30 секунд или 1 минуту или более.

Также обратите внимание, что это connection timeout only. Это означает, что вы должны быть в состоянии установить sh протокол соединения с удаленным сервером в течение этого времени, но это ничего не значит для передачи данных. Передача данных - процесс, который идет дальше, когда соединение установлено. Для тайм-аута передачи данных (который определенно должен быть установлен выше) вам необходимо использовать setReadTimeout () .

Наконец, вы должны установить тайм-аут соединения до вызова connect() в противном случае это не имеет смысла, так как уже слишком поздно - это то, что вы получили в своем коде сейчас.

PS: используйте Диспетчер загрузки .

...