Насколько я понимаю, это как-то связано с моим непониманием сопрограмм и переключения диспетчеров. Но, возможно, это не так.
Вот полный код:
Код: Выделить всё
private fun setDownloadClickListener() {
binding.downloadIcon.setOnClickListener {
binding.downloadIcon.gone()
binding.downloadProgressTextView.visible()
binding.downloadProgressTextView.text = "0.00"
binding.downloadProgressBar.visible()
lifecycleScope.launch {
try {
downloadFile { progress ->
println("Download Progress: $progress")
withContext(Dispatchers.Main) {
binding.downloadProgressTextView.text = progress.toDecimalPoints(2)
}
}
} catch (e: Exception) {
binding.downloadIcon.visible()
}
binding.downloadProgressTextView.text = ""
binding.downloadProgressTextView.gone()
binding.downloadProgressBar.gone()
}
}
}
Код: Выделить всё
suspend fun downloadFile(
progressListener: (suspend (Float) -> Unit)? = null
) {
withContext(Dispatchers.IO) {
var linkFileSize: Int
if (downloadFile.exists().not()) {
downloadFile.parentFile?.mkdirs()
downloadFile.createNewFile()
}
URL(fileLink)
.also { linkFileSize = it.openConnection().contentLength }
.openStream().use { downloadStream ->
FileOutputStream(downloadFile).use { fos ->
val data = ByteArray(CHUNK_SIZE)
var count: Int
var bytesDownloaded = 0
while (
downloadStream.read(data, 0, CHUNK_SIZE)
.also {
count = it
bytesDownloaded += count
} != -1
) {
fos.write(data, 0, count)
progressListener?.invoke(bytesDownloaded.toFloat() / linkFileSize.toFloat())
}
}
}
}
}
Подробнее здесь: https://stackoverflow.com/questions/781 ... s-down-dow