Какими способами можно загрузить файлы в приложении, плюсы и минусы каждого подхода
Что проверяют
Понимаете ли вы, что на Android главный вопрос не «какой библиотекой качать», а что станет с передачей, когда пользователь свернёт приложение или система убьёт процесс. Следом спрашивают про прогресс, докачку и куда сохранять файл без лишних разрешений.
Как отвечать
Уточните, о чём речь: скачивание или отправка на сервер, по-русски это одно слово. Дальше подходы:
- OkHttp/Retrofit в корутине:
@StreamingиResponseBody.byteStream()для скачивания,MultipartBodyдля отправки. Плюс: полный контроль над заголовками, авторизацией, прогрессом. Минус: работа живёт, пока жив скоуп и процесс, докачку черезRangeпишете сами; DownloadManager: системный сервис, качает вне процесса приложения, показывает уведомление, сам повторяет попытки. Минусы: только скачивание, мало контроля, неудобно с короткоживущими токенами;- WorkManager: гарантированное выполнение с ограничениями вроде
NetworkType.UNMETERED, backoff при ошибках, переживает перезагрузку. Долгую передачу переводят в foreground черезsetForeground, с Android 14 для этого объявляют типdataSync. Минус: система может отложить запуск; - SDK облачного хранилища или presigned URL в S3-совместимое хранилище: файл идёт мимо вашего бэкенда, возобновляемая загрузка из коробки. Минус: зависимость от провайдера и цена трафика;
- картинки: Coil или Glide со своим дисковым кэшем, самописный код не нужен.
Скажите и про хранение: в filesDir и getExternalFilesDir пишут без разрешений, в общие папки со времён scoped storage через MediaStore. Файл для отправки берут через Photo Picker или OpenDocument и читают по Uri через ContentResolver, а не по пути.
Где спотыкаются
Читают весь файл в память через bytes(). На видео в сотни мегабайт это OutOfMemoryError, нужен поток.
Запускают передачу в viewModelScope и удивляются, что она обрывается при уходе с экрана. Долгая загрузка должна жить в WorkManager или сервисе.
Предлагают FTP. Обычный FTP не шифрует ни данные, ни пароль, в мобильных клиентах файлы передают по HTTPS.