Middle+
Jak byste implementovali možnost práce s aplikací v režimu offline?
sobes.tech AI
Odpověď od AI
Pro implementaci offline režimu bych použil kombinaci místního úložiště dat a mechanismu synchronizace.
-
Místní úložiště:
- Pro strukturovaná a relační data: Room databáze (abstrakce nad SQLite).
- Pro klíč-hodnotová data: SharedPreferences nebo Jetpack DataStore.
- Pro velká binární data (obrázky, videa): Uložení na interní nebo externí úložiště.
// Příklad použití Room databáze @Entity data class User( @PrimaryKey val userId: Int, val name: String, val email: String ) @Dao interface UserDao { @Query("SELECT * FROM user") fun getAllUsers(): Flow<List<User>> @Insert(onConflict = OnConflictStrategy.REPLACE) suspend fun insertUsers(users: List<User>) } -
Mechanismus synchronizace:
- Sledování stavu síťového připojení pomocí
ConnectivityManagerneboNetworkCallback. - Použití WorkManager pro pozadí úkoly synchronizace.
- Strategie synchronizace:
- Push: Odeslání místních změn na server při připojení.
- Pull: Stažení změn ze serveru při připojení.
- Two-way: Kombinace Push a Pull s řešením konfliktů.
- Řešení konfliktů při slučování dat (například Last-Write Wins, Merging).
// Příklad použití WorkManager pro synchronizaci class SyncWorker(appContext: Context, workerParams: WorkerParameters) : CoroutineWorker(appContext, workerParams) { override suspend fun doWork(): Result { return try { // Logika synchronizace: načítání dat ze serveru, ukládání do Room Result.success() } catch (e: Exception) { Result.failure() } } } // Spuštění úkolu synchronizace při obnovení připojení val syncRequest = OneTimeWorkRequestBuilder<SyncWorker>() .setConstraints(Constraints.Builder().setRequiredNetworkType(NetworkType.CONNECTED).build()) .build() WorkManager.getInstance(context).enqueue(syncRequest) - Sledování stavu síťového připojení pomocí
-
Uživatelské rozhraní:
- Zobrazení místně uložených dat uživateli.
- Indikace stavu sítě a procesu synchronizace.
- Zobrazení chybových hlášení synchronizace.
// Příklad použití ViewModel pro získání dat z Room class UserViewModel(private val userDao: UserDao) : ViewModel() { val users: LiveData<List<User>> = userDao.getAllUsers().asLiveData() fun syncUsers() { // Spuštění synchronizace přes WorkManager nebo přímo } }
Hlavní kroky offline režimu:
| Stav sítě | Akce aplikace |
|---|---|
| Online | Zobrazení aktuálních dat, načítání/odesílání v reálném čase |
| Offline | Zobrazení místně uložených dat, cachování změn pro pozdější odeslání |
| Obnovení připojení | Spuštění synchronizace na pozadí |