Обновление хода загрузки с помощью withContext(Dispatchers.Main) замедляет процесс загрузки в AndroidAndroid

Форум для тех, кто программирует под Android
Ответить
Гость
 Обновление хода загрузки с помощью withContext(Dispatchers.Main) замедляет процесс загрузки в Android

Сообщение Гость »

Я столкнулся со странной ситуацией, когда обновление процесса загрузки замедляет общую скорость загрузки. Если я не показываю ход загрузки, загрузка завершится через 2 минуты. А если я показываю ход загрузки, то загрузка занимает от 20 до 30 минут.
Насколько я понимаю, это как-то связано с моим непониманием сопрограмм и переключения диспетчеров. Но, возможно, это не так.
Вот полный код:

Код: Выделить всё

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()
}
}
}
Обратите внимание, что функция downloadFile внутренне переключает диспетчер, используя withContext(Dispatchers.IO).

Код: Выделить всё

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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»