The Reality of Mobile Connectivity
Mobile devices operate in unpredictable network conditions: subway commutes, rural environments, and congested networks lead to dropped packets and frequent disconnects. Applications that assume continuous connectivity inevitably deliver degraded user experiences, lost input, and jarring error dialogs.
When building EAP Tracker, an application used by students studying for competitive engineering entrance exams, offline reliability was our highest engineering requirement. Students could not afford to lose revision logs or progress data simply because their connection dropped.
Architectural Layers
We adopted a clean, reactive architecture with a single source of truth:
UI Layer (Jetpack Compose / XML Views)
│
▼
ViewModel (StateFlow / UI State)
│
▼
Repository (Orchestrates Local vs Remote)
┌──────┴──────┐
▼ ▼
[ Room DB ] [ WorkManager ]
(Single Truth) (Sync Queue)
│
▼
[ Cloud Backend ]
1. Room as the Single Source of Truth
The UI never observes network responses directly. Instead, all mutations write immediately to the local Room SQLite database. The UI observes database tables via reactiveFlow streams. When local data changes, the UI updates instantly with zero perceived latency.
2. Deferred Synchronization with WorkManager
Network requests are decoupled from user interactions. When a student marks a chapter as reviewed: 1. The record is inserted into Room with async_status = PENDING flag.
2. A synchronization job is enqueued with Android's WorkManager.
3. WorkManager guarantees execution even if the app process is terminated or the device restarts.
4. Constraints ensure the worker only activates when a stable network connection is confirmed.
Conflict Resolution Strategy
When offline updates must synchronize with a cloud backend, conflict resolution is essential. We implemented a Last-Write-Wins (LWW) strategy backed by monotonic timestamps: - Every entity carries an updated_at millisecond timestamp. - During sync, the server compares the incoming entity's timestamp against the stored record. - If the incoming client modification is newer, the server updates. Otherwise, the server sends the canonical cloud state back to update the local client.
Summary
Building truly resilient mobile apps requires shifting from an "online with offline fallback" mindset to an "offline with background sync" paradigm. By leveraging Room and WorkManager, developers can build experiences that feel reliable anywhere in the world.