Столкнулся с непонятным поведением Ktor. Пытаюсь загрузить файл, получить процент загрузки и записать файл, но процесс загрузки зафризился в этой функции
val httpResponse = client.get(fileUrl)
. В итоге приложение крашит из-за истечения тайм-аута, который 60 секунд.
val fileUrl = "https://speed.hetzner.de/100MB.bin"
val fileName = "file"
val client = HttpClient {
install(HttpTimeout) {
connectTimeoutMillis = 60000 // пробовал ждать 60 секунд
}
}
val file = File(getExternalFilesDir(null), fileName)
lifecycleScope.launch(Dispatchers.IO) {
val httpResponse = client.get(fileUrl) // здесь фриз и дальше код не работает
println(httpResponse.headers.toString())
val channel: ByteReadChannel = httpResponse.body()
val byteArray = ByteArray(httpResponse.contentLength()!!.toInt())
var offset = 0
do {
val currentRead = channel.readAvailable(byteArray, offset, byteArray.size)
offset += currentRead
val progress = (offset * 100f / byteArray.size).roundToInt()
println("progress: $progress")
} while (currentRead > 0)
client.close()
if (httpResponse.status.isSuccess()) {
file.writeBytes(byteArray)
println("A file saved to ${file.path}")
} else {
println("error")
}
}
Логи Ktor
022-08-16 23:55:40.802 30343-30389/com.example.myapplication I/System.out: 20:55:40.795 [DefaultDispatcher-worker-3] INFO io.ktor.client.HttpClient - REQUEST: https://speed.hetzner.de/100MB.bin
2022-08-16 23:55:40.802 30343-30389/com.example.myapplication I/System.out: METHOD: HttpMethod(value=GET)
2022-08-16 23:55:40.802 30343-30389/com.example.myapplication I/System.out: COMMON HEADERS
2022-08-16 23:55:40.802 30343-30389/com.example.myapplication I/System.out: -> Accept: */*
2022-08-16 23:55:40.802 30343-30389/com.example.myapplication I/System.out: -> Accept-Charset: UTF-8
2022-08-16 23:55:40.802 30343-30389/com.example.myapplication I/System.out: CONTENT HEADERS
2022-08-16 23:55:40.802 30343-30389/com.example.myapplication I/System.out: -> Content-Length: 0
2022-08-16 23:55:40.802 30343-30389/com.example.myapplication I/System.out: BODY Content-Type: null
2022-08-16 23:55:40.802 30343-30389/com.example.myapplication I/System.out: BODY START
2022-08-16 23:55:40.802 30343-30389/com.example.myapplication I/System.out:
2022-08-16 23:55:40.802 30343-30389/com.example.myapplication I/System.out: BODY END
P.S Если вместо ссылки на файл поставлю ссылку на .json = все работает