Обновление хода загрузки с помощью 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 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Сопрограмма Kotlin в Dispatchers.Main не блокирует основной поток
    Гость » » в форуме Android
    0 Ответы
    41 Просмотры
    Последнее сообщение Гость
  • Могу ли я использовать withContext() и withTransaction вместе в Kotlin/Android?
    Anonymous » » в форуме Android
    0 Ответы
    7 Просмотры
    Последнее сообщение Anonymous
  • Как правильно использовать Dispatchers.IO для чтения локальных файлов на Android?
    Anonymous » » в форуме Android
    0 Ответы
    13 Просмотры
    Последнее сообщение Anonymous
  • Как правильно использовать Dispatchers.IO для чтения локальных файлов на Android?
    Anonymous » » в форуме Android
    0 Ответы
    16 Просмотры
    Последнее сообщение Anonymous
  • Как правильно использовать Dispatchers.IO для чтения локальных файлов на Android?
    Anonymous » » в форуме Android
    0 Ответы
    9 Просмотры
    Последнее сообщение Anonymous

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