Какие способы синхронизации данных существуют
Что проверяют
Под этим вопросом в Android обычно имеют в виду синхронизацию локальных данных с сервером: как приложение работает без сети и как не потерять изменения. Следом спрашивают про конфликты, когда одну запись поменяли и на телефоне, и на сервере.
Как отвечать
Опорная архитектура это offline-first: единственный источник правды для UI это локальная база Room, экран подписан на Flow из DAO, а сеть только обновляет базу.
- pull по расписанию:
PeriodicWorkRequestв WorkManager, минимальный интервал 15 минут,Constraintsна сеть и заряд,enqueueUniquePeriodicWork, чтобы не плодить дубли. Тянуть инкрементально: курсор,updated_sinceилиETag, а не весь набор каждый раз; - push-сигнал: data-сообщение FCM сообщает «есть изменения» и запускает синхронизацию. Сами данные в пуш не кладут, у него лимит 4 КБ и нет гарантии доставки;
- реальное время: WebSocket через OkHttp или SSE, пока пользователь на экране. В фоне такое соединение не держат: Doze и ограничения фоновой работы его всё равно оборвут;
- отправка изменений: outbox-таблица с очередью операций, отправка через
OneTimeWorkRequestс backoff, клиентский UUID для идемпотентности; - конфликты: last write wins по версии записи, слияние по полям, для совместного редактирования CRDT. Удаления передаются tombstone-записями;
- готовые решения: офлайн-кэш Firestore.
SyncAdapterвстречается в старом коде, новые проекты делают на WorkManager.
Если интервьюер уточнит, что имел в виду потоки, это другой разговор: Mutex из корутин, synchronized, атомики, StateFlow.
Где спотыкаются
Ходят в REST прямо с экрана без локального хранения. Без сети пусто, после поворота снова загрузка, а данные в памяти и на сервере расходятся.
Не продумывают конфликты и удаления. Без tombstone удалённая на сервере запись вернётся из локальной базы при следующей отправке.
Пытаются синхронизировать через свой Service с таймером или ждут от PeriodicWorkRequest запуска раз в минуту. Фоновые ограничения Android такое не пропустят, а WorkManager и не обещает точного времени.