Что нужно учитывать при работе с сетью в Android
Что проверяют
Писали ли вы сетевой слой для реальных условий: мобильная сеть, переключение с Wi-Fi на LTE, поворот экрана, Doze. Интервьюер ждёт не список библиотек, а понимание, что запрос может оборваться в любой момент. Следом часто просят показать обработку ошибок и отмену запроса.
Как отвечать
Пройдитесь по слоям:
- поток: сеть на главном потоке запрещена, система бросает
NetworkOnMainThreadException. Стандарт сейчас это корутины:suspend-методы Retrofit сами уходят с main, свой блокирующий код оборачивают вwithContext(Dispatchers.IO).AsyncTaskобъявлен устаревшим ещё в API 30; - жизненный цикл: запрос из
viewModelScopeпереживает поворот экрана и отменяется вместе с ViewModel; - ошибки: у
suspend-вызова Retrofit ответ не 2xx превращается вHttpException, обрыв связи вIOException. Первое показывают как ошибку сервера, второе как «нет сети» с кнопкой повтора; - таймауты и ретраи: у OkHttp по умолчанию 10 секунд на подключение, чтение и запись. Повтор с экспоненциальной задержкой делают только для идемпотентных запросов;
- безопасность: с Android 9 открытый HTTP запрещён по умолчанию, исключения описывают в Network Security Config. Там же или через
CertificatePinnerделается пиннинг. Токены не хранят открытым текстом, ключ шифрования держат в Android Keystore; - офлайн: кеш OkHttp работает только с настроенным
Cacheи правильными заголовками. Надёжнее Room как единый источник правды: UI читает из базы, сеть её обновляет; - фон: отложенную отправку ставят в
WorkManagerс ограничениемNetworkType.CONNECTED, он переживёт перезапуск процесса.
Где спотыкаются
Проверяют наличие сети перед запросом и считают, что этого достаточно. Сеть может пропасть посреди ответа, а «подключено» не значит «интернет доступен», поэтому ошибку всё равно обрабатывают.
Ловят Exception целиком внутри корутины и заодно перехватывают CancellationException. Отмена ломается, и экран продолжает работу, которой уже никто не ждёт.
Повторяют неидемпотентный POST при таймауте и получают двойной заказ или платёж. Нужен ключ идемпотентности или отказ от автоповтора.