Middle+
Ako by ste implementovali možnosť práce s aplikáciou v režime offline?
sobes.tech AI
Odpoveď od AI
Pre implementácie offline režimu by som použil kombináciu miestneho ukladania dát a mechanizmu synchronizácie.
-
Miestne ukladanie:
- Pre štruktúrované a relačné dáta: Room databáza (abstrakcia nad SQLite).
- Pre kľúč-hodnotové dáta: SharedPreferences alebo Jetpack DataStore.
- Pre veľké binárne dáta (obrázky, videá): Ukladanie na vnútorné alebo vonkajšie úložisko.
// Príklad použitia Room databázy @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>) } -
Mechanizmus synchronizácie:
- Sledovanie stavu siete pomocou
ConnectivityManageraleboNetworkCallback. - Použitie WorkManager pre úlohy na pozadí synchronizácie.
- Stratégie synchronizácie:
- Push: odoslanie lokálnych zmien na server pri pripojení.
- Pull: stiahnutie zmien zo servera pri pripojení.
- Two-way: kombinácia Push a Pull s riešením konfliktov.
- Riešenie konfliktov pri zlúčení dát (napr., Last-Write Wins, Merging).
// Príklad použitia WorkManager na synchronizáciu class SyncWorker(appContext: Context, workerParams: WorkerParameters) : CoroutineWorker(appContext, workerParams) { override suspend fun doWork(): Result { return try { // Logika synchronizácie: načítanie dát zo servera, uloženie do Room Result.success() } catch (e: Exception) { Result.failure() } } } // Spustenie úlohy synchronizácie pri obnovení pripojenia val syncRequest = OneTimeWorkRequestBuilder<SyncWorker>() .setConstraints(Constraints.Builder().setRequiredNetworkType(NetworkType.CONNECTED).build()) .build() WorkManager.getInstance(context).enqueue(syncRequest) - Sledovanie stavu siete pomocou
-
Používateľské rozhranie:
- Zobrazenie lokálne uložených dát používateľovi.
- Indikácia stavu siete a procesu synchronizácie.
- Zobrazenie chybových správ synchronizácie.
// Príklad použitia ViewModel na získanie dát z Room class UserViewModel(private val userDao: UserDao) : ViewModel() { val users: LiveData<List<User>> = userDao.getAllUsers().asLiveData() fun syncUsers() { // Spustenie synchronizácie cez WorkManager alebo priamo } }
Hlavné kroky práce offline režimu:
| Stav siete | Akcie aplikácie |
|---|---|
| Online | Zobrazenie aktuálnych dát, načítanie/odosielanie v reálnom čase |
| Offline | Zobrazenie lokálne uložených dát, kešovanie zmien na neskôr |
| Obnovenie pripojenia | Spustenie synchronizácie na pozadí |