Отображаем процесс скачивание файла в ProgressDialog в Android

Чтобы скачать файл в Android-приложении и отобразить прогресс в ProgressDialog
, можно использовать Kotlin Coroutines с библиотекой OkHttp
для загрузки и ProgressDialog
для отображения прогресса. Вот пошаговая инструкция:
1. Добавление зависимостей
Сначала добавьте необходимые зависимости для OkHttp
в файл build.gradle
:
implementation 'com.squareup.okhttp3:okhttp:4.9.2'
2. Создание макета
В макете вашего Activity не нужно добавлять что-то специфическое для ProgressDialog
, так как это модальный диалог, который отображается поверх вашего пользовательского интерфейса.
3. Реализация кода
Вот пример кода, который показывает, как настроить задачу загрузки с отслеживанием прогресса, используя Kotlin Coroutines:
import android.app.ProgressDialog
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import kotlinx.coroutines.*
import okhttp3.OkHttpClient
import okhttp3.Request
import okhttp3.ResponseBody
import java.io.File
import java.io.FileOutputStream
import java.io.InputStream
class DownloadActivity : AppCompatActivity() {
private val downloadUrl = "https://example.com/file.zip"
private lateinit var progressDialog: ProgressDialog
private val client = OkHttpClient()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// Инициализация ProgressDialog
progressDialog = ProgressDialog(this).apply {
setMessage("Загрузка...")
setProgressStyle(ProgressDialog.STYLE_HORIZONTAL)
setCancelable(false)
max = 100
}
// Начало загрузки
downloadFile(downloadUrl)
}
private fun downloadFile(url: String) {
progressDialog.show()
CoroutineScope(Dispatchers.IO).launch {
try {
val request = Request.Builder().url(url).build()
val response = client.newCall(request).execute()
if (response.isSuccessful) {
response.body?.let { responseBody ->
saveFile(responseBody)
}
} else {
// Обработка ошибки
}
} catch (e: Exception) {
e.printStackTrace() // Обработка исключений
}
}
}
private suspend fun saveFile(body: ResponseBody) {
val file = File(getExternalFilesDir(null), "downloaded_file.zip")
val totalSize = body.contentLength()
var downloadedSize: Long = 0
body.byteStream().use { inputStream ->
FileOutputStream(file).use { outputStream ->
val buffer = ByteArray(1024)
var bytesRead: Int
while (inputStream.read(buffer).also { bytesRead = it } != -1) {
downloadedSize += bytesRead
outputStream.write(buffer, 0, bytesRead)
updateProgress(downloadedSize, totalSize)
}
outputStream.flush()
}
}
withContext(Dispatchers.Main) {
progressDialog.dismiss()
}
}
private suspend fun updateProgress(downloadedSize: Long, totalSize: Long) {
val progress = (downloadedSize * 100 / totalSize).toInt()
withContext(Dispatchers.Main) {
progressDialog.progress = progress
}
}
}
4. Объяснение
ProgressDialog
: Отображает прогресс загрузки. Установлен в горизонтальный режим (STYLE_HORIZONTAL
).Kotlin Coroutines
: Используются для выполнения задачи загрузки в фоновом потоке (Dispatchers.IO
) и обновления интерфейса в основном потоке.OkHttp
: Используется для выполнения HTTP-запроса на загрузку.- Запись файла: Данные из ответа записываются в файл на диск с отслеживанием прогресса загрузки.
5. Разрешения
Не забудьте добавить необходимые разрешения в ваш AndroidManifest.xml
:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
Примечания:
- Обработка разрешений: Начиная с Android 6.0 (API 23), вам нужно запрашивать разрешение на
WRITE_EXTERNAL_STORAGE
во время выполнения, если ваша целевая версия SDK 23 или выше. - ProgressDialog в настоящее время считается устаревшим. Для более современных интерфейсов рекомендуется использовать
ProgressBar
вместоProgressDialog
.
Эта реализация будет обрабатывать загрузку файла и отображать прогресс через ProgressDialog
. Вы можете заменить ProgressDialog
на более современный компонент интерфейса при необходимости.